Kann ich eine select-Anweisung ausführen und die Zeilennummer abrufen, wenn die Elemente sortiert sind?
Ich habe einen Tisch wie diesen:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
Ich kann diese Abfrage dann ausführen, um die Anzahl der Bestellungen nach ID zu ermitteln:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Dies gibt mir eine Zählung von jedem itemID
in der Tabelle wie folgt:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Ich möchte auch die Zeilennummer erhalten, damit ich feststellen kann, dass itemID=388
es sich um die erste Zeile, 234
die zweite usw. handelt (im Wesentlichen die Rangfolge der Bestellungen, nicht nur eine Rohzählung). Ich weiß, dass ich dies in Java tun kann, wenn ich die Ergebnismenge zurückerhalte, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, dies nur in SQL zu handhaben.
Aktualisieren
Durch Festlegen des Ranges wird dieser zur Ergebnismenge hinzugefügt, jedoch nicht richtig geordnet:
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)
quelle
ORDER BY rank ASC
bestellen möchten, verwenden Sie (Reihenfolge nach Rang in aufsteigender Reihenfolge). Ich denke, das ist es, was du meinst, aber nicht richtig bestelltAntworten:
Schauen Sie sich auf diese .
Ändern Sie Ihre Abfrage in:
Die letzte Auswahl ist Ihre Anzahl.
quelle
ORDER BY ordercount DESC
, und wickeln Sie dann die gesamte Abfrage in eine andere ein,SELECT
die alles von der ersten abruft, aber nach der Rangspalte ordnet (in diesem Fall 0).quelle
t1
und erklärent2
?x
undy
.Die Lösung von Swamibebop funktioniert, aber wenn
table.*
wir die Syntax nutzen, können wir vermeiden, die Spaltennamen des Inneren zu wiederholen,select
und ein einfacheres / kürzeres Ergebnis erzielen :Das gibt Ihnen also:
quelle
@r := @r + 1
in einer select-Anweisung funktioniert, aber wenn es sich um eine gespeicherte Prozedur mit handeltdeclare r int; set r = 0;
, beschwert es sich (onr := r +1
)?Sie können dazu MySQL-Variablen verwenden. So etwas sollte funktionieren (es besteht jedoch aus zwei Abfragen).
quelle
order by
dies geschieht, nachdem die Variable@x
ausgewertet wurde. Versuchen Sie zu experimentieren, indem Sie anhand der anderen Spalten bestellen. Experimentieren Sie auch mit beidendesc
undasc
. Sie werden sehen, dass sie oft versagen und das einzige Mal, wenn es funktioniert, ist es reines Glück , dass die Reihenfolge Ihrer ursprünglichen "Auswahl" dieselbe Reihenfolge hat wie die Reihenfolge vonorder by
. Siehe meine Lösung und / oder Swamibebops Lösung.ASC
/DESC
die Reihenfolge, in der diese Zahlen nummeriert wurden (vom kleinsten zum größten oder umgekehrt). Es sieht also so aus, als ob in diesem Fallorder by
zuerst bewertet wurde.Es ist jetzt in MySQL 8.0 und MariaDB 10.2 integriert:
quelle