Puis-je exécuter une instruction de sélection 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 compte de chacun 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 ligne, donc je pourrais dire que itemID=388
c'est la première ligne, la 234
deuxième, etc. (essentiellement le classement des commandes, pas seulement un décompte brut). Je sais que je peux faire cela en Java lorsque je récupère le résultat, mais je me demandais s'il y avait un moyen de le gérer uniquement en SQL.
Mettre à jour
La définition du 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)
mysql
sql
row-number
George
la source
la source
ORDER BY rank ASC
(classement par rang dans l'ordre ASCending). Je suppose que c'est ce que vous entendez par mais pas correctement commandéRéponses:
Jetez un œil à ceci .
Modifiez votre requête en:
Le dernier choix est votre décompte.
la source
ORDER BY ordercount DESC
, puis enveloppez toute la requête dans une autreSELECT
qui récupère tout à partir de la première, mais triée par la colonne de rang (0 dans ce cas).la source
t1
ett2
?x
ety
.La solution de Swamibebop fonctionne, mais en tirant parti de la
table.*
syntaxe, nous pouvons éviter de répéter les noms de colonne de l'intérieurselect
et obtenir un résultat plus simple / plus court:Cela vous donnera donc:
la source
@r := @r + 1
dans une instruction select fonctionne, mais si c'est dans une procédure stockée avecdeclare r int; set r = 0;
, il se plaint (onr := r +1
)?Vous pouvez utiliser des variables MySQL pour le faire. Quelque chose comme ça devrait fonctionner (cependant, il se compose de deux requêtes).
la source
order by
cela se produit après que la variable@x
a été évaluée. Essayez de faire des essais en classant en utilisant les autres colonnes. Expérimentez également avecdesc
etasc
. Vous verrez que plusieurs fois ils échoueront et que les seuls moments où cela fonctionne, c'est par pure chance en raison de l'ordre de votre "select" d'origine ayant le même ordre que celui deorder by
. Voir ma solution et / ou la solution de Swamibebop.ASC
/DESC
changerait l'ordre dans lequel ces nombres ont été numérotés (du plus petit au plus grand ou vice versa). Donc, il semble que dans ce cas, aorder by
été évalué en premier.Il est maintenant intégré à MySQL 8.0 et MariaDB 10.2:
la source