Czy mogę uruchomić instrukcję select i uzyskać numer wiersza, jeśli elementy są posortowane?
Mam taki stół:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
Następnie mogę uruchomić to zapytanie, aby uzyskać liczbę zamówień według identyfikatora:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Daje mi to liczbę itemID
w tabeli w następujący sposób:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Chcę również uzyskać numer wiersza, więc mógłbym powiedzieć, że itemID=388
jest to pierwszy wiersz, 234
jest drugi itd. (Zasadniczo ranking zamówień, a nie tylko surowa liczba). Wiem, że mogę to zrobić w Javie, gdy odzyskam wyniki, ale zastanawiałem się, czy istnieje sposób, aby poradzić sobie z tym czysto w języku SQL.
Aktualizacja
Ustawienie rangi dodaje ją do zestawu wyników, ale nie jest odpowiednio uporządkowana:
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
Jerzy
źródło
źródło
ORDER BY rank ASC
(sortuj według rangi w porządku rosnącym). Myślę, że właśnie to masz na myśli, ale nie odpowiednio uporządkowaneOdpowiedzi:
Spójrz na to .
Zmień zapytanie na:
Ostatni wybór to liczba.
źródło
ORDER BY ordercount DESC
, a następnie zawiń całe zapytanie w innym,SELECT
który pobiera wszystko od pierwszego, ale porządkuje według kolumny rangi (w tym przypadku 0).źródło
t1
it2
?x
iy
.Rozwiązanie Swamibebop działa, ale korzystając ze
table.*
składni, możemy uniknąć powtarzania nazw wewnętrznych kolumnselect
i uzyskać prostszy / krótszy wynik:To da ci:
źródło
@r := @r + 1
działa użycie instrukcji select, ale jeśli jest w procedurze składowanejdeclare r int; set r = 0;
, narzeka (włączar := r +1
)?Możesz użyć do tego zmiennych MySQL. Coś takiego powinno działać (jednak składa się z dwóch zapytań).
źródło
order by
dzieje się to po@x
ocenie zmiennej . Spróbuj eksperymentować, zamawiając za pomocą innych kolumn. Poeksperymentować także z obudesc
iasc
. Przekonasz się, że wiele razy zawiodą, a tylko wtedy, gdy to działa, to przez szczęście, ponieważ kolejność twojego oryginalnego „wyboru” ma taką samą kolejność jak kolejnośćorder by
. Zobacz moje rozwiązanie i / lub rozwiązanie Swamibebop.ASC
/DESC
zmieniłby kolejność, w jakiej te liczby były ponumerowane (od najmniejszej do największej lub odwrotnie). Wygląda na to, że w tym przypadkuorder by
został oceniony jako pierwszy.Jest teraz wbudowany w MySQL 8.0 i MariaDB 10.2:
źródło