Puis-je exécuter une instruction select et obtenir le numéro de ligne si les éléments sont triés?
J'ai une table comme celle-ci:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
Je peux ensuite exécuter cette requête pour obtenir le nombre de commandes par ID:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Cela me donne un nombre de chaque itemID
dans le tableau comme ceci:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Je veux aussi obtenir le numéro de la ligne, de sorte que je puisse dire que itemID=388
est la première ligne, 234
est deuxième, etc. Je sais que je peux le faire dans Java lorsque le résultat est annulé, mais je me demandais s'il existait un moyen de le gérer uniquement en SQL.
Mise à jour
Définir le rang l'ajoute à l'ensemble de résultats, mais pas correctement ordonné:
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)
Jetez un oeil à this .
Modifiez votre requête en:
SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID
ORDER BY ordercount DESC;
SELECT @rank;
La dernière sélection est votre compte.
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;
La solution de Swamibebop fonctionne, mais en tirant parti de table.*
syntaxe, nous pouvons éviter de répéter les noms de colonne du select
intérieur et obtenir un résultat plus simple/plus court:
SELECT @r := @r+1 ,
z.*
FROM(/* your original select statement goes in here */)z,
(SELECT @r:=0)y;
Cela vous donnera donc:
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;
Vous pouvez utiliser des variables MySQL pour le faire. Quelque chose comme cela devrait fonctionner (cependant, il se compose de deux requêtes).
SELECT 0 INTO @x;
SELECT itemID,
COUNT(*) AS ordercount,
(@x:=@x+1) AS rownumber
FROM orders
GROUP BY itemID
ORDER BY ordercount DESC;