web-dev-qa-db-fra.com

MySQL - Récupère le numéro de ligne sur select

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)
175
George

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.

174
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;
171
swamibebop

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;
28
Pacerier

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; 
11
Chibu