web-dev-qa-db-ja.com

MySQL - selectで行番号を取得する

アイテムがソートされている場合、selectステートメントを実行して行番号を取得できますか?

私はこのようなテーブルがあります:

mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| orderID     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| itemID      | bigint(20) unsigned | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

次に、このクエリを実行してID別の注文数を取得できます。

SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;

これにより、テーブル内の各itemIDの数が次のようになります。

+--------+------------+
| itemID | ordercount |
+--------+------------+
|    388 |          3 |
|    234 |          2 |
|   3432 |          1 |
|    693 |          1 |
|   3459 |          1 |
+--------+------------+

行番号も取得したいので、itemID=388が1行目、234が2行目などであることがわかります(基本的に、生の件数ではなく注文のランク付け)。結果セットを取り戻すときにJavaでこれを実行できることはわかっていますが、純粋にSQLで処理する方法があるかどうか疑問に思いました。

更新

ランクを設定すると結果セットに追加されますが、順序は正しくありません。

mysql> SET @rank=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
    -> FROM orders
    -> GROUP BY itemID ORDER BY rank DESC;
+------+--------+------------+
| rank | itemID | ordercount |
+------+--------+------------+
|    5 |   3459 |          1 |
|    4 |    234 |          2 |
|    3 |    693 |          1 |
|    2 |   3432 |          1 |
|    1 |    388 |          3 |
+------+--------+------------+
5 rows in set (0.00 sec)
171
George

this を見てください。

クエリを次のように変更します。

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC;
SELECT @rank;

最後の選択はあなたのカウントです。

172
Mike Cialowicz
SELECT @rn:=@rn+1 AS rank, itemID, ordercount
FROM (
  SELECT itemID, COUNT(*) AS ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC
) t1, (SELECT @rn:=0) t2;
170
swamibebop

Swamibebopのソリューションはうまくいきますが、 table.* 構文、我々はすることができます 繰り返しを避ける 内側のselectのカラム名で、よりシンプルで短い結果が得られます。

SELECT @r := @r+1 , 
       z.* 
FROM(/* your original select statement goes in here */)z, 
(SELECT @r:=0)y;

だからそれはあなたを与えるでしょう:

SELECT @r := @r+1 , 
       z.* 
FROM(
     SELECT itemID, 
     count(*) AS ordercount
     FROM orders
     GROUP BY itemID
     ORDER BY ordercount DESC
    )z,
    (SELECT @r:=0)y;
27
Pacerier

あなたはそれを行うためにMySQLの変数を使用することができます。このようなものでも動作するはずです(ただし、2つのクエリで構成されています)。

SELECT 0 INTO @x;

SELECT itemID, 
       COUNT(*) AS ordercount, 
       (@x:=@x+1) AS rownumber 
FROM orders 
GROUP BY itemID 
ORDER BY ordercount DESC; 
10
Chibu