アイテムがソートされている場合、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)
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;
最後の選択はあなたのカウントです。
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;
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;
あなたはそれを行うために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;