1. ホーム
  2. mysql

[解決済み】MySQL - selectで行番号を取得する

2022-04-14 06:10:13

質問

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 は最初の行です。 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)

解決方法は?

をご覧ください。 これ .

クエリを変更します。

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

最後のselectはカウントです。