198

項目がソートされている場合、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、最初の行、2342 番目の行などがわかります (基本的には、生のカウントだけでなく、注文のランキングです)。結果セットが返されたときに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)
4

6 に答える 6

195

これを見てください。

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

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

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

于 2010-03-26T00:15:00.210 に答える
182
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;
于 2010-12-17T20:10:33.453 に答える
36

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;
于 2015-04-24T11:33:11.640 に答える
12

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; 
于 2010-03-26T00:19:12.317 に答える