Могу ли я выполнить оператор выбора и получить номер строки, если элементы отсортированы?
У меня есть такая таблица:
mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
Затем я могу выполнить этот запрос, чтобы получить количество заказов по идентификатору:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Это дает мне счет каждого itemID
в таблице следующим образом:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Я также хочу получить номер строки, чтобы я мог сказать, что itemID=388
это первая строка, 234
вторая и т. Д. (По сути, это ранжирование ордеров, а не просто подсчет). Я знаю, что могу сделать это в Java, когда получу результат обратно, но мне было интересно, есть ли способ справиться с этим чисто в SQL.
Обновить
Установка ранга добавляет его к результирующему набору, но не в правильном порядке:
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
Джордж
источник
источник
ORDER BY rank ASC
(упорядочение по рангу в порядке ASCending). Я думаю, это то, что вы имеете в виду, но не правильно упорядоченыОтветы:
Посмотрите на это .
Измените ваш запрос на:
Последний выбор - ваш счет.
источник
ORDER BY ordercount DESC
, а затем обернуть весь запрос в другой,SELECT
который получает все от первого, но упорядочивает по столбцу ранга (в данном случае 0).источник
t1
иt2
?x
иy
.Решение Swamibebop работает, но, используя преимущества
table.*
синтаксиса, мы можем избежать повторения имен столбцов внутреннегоselect
и получить более простой / короткий результат:Так что это даст вам:
источник
@r := @r + 1
в операторе select работает, но если оно в хранимой процедуре сdeclare r int; set r = 0;
, оно жалуется (наr := r +1
)?Вы можете использовать переменные MySQL, чтобы сделать это. Нечто подобное должно работать (хотя оно состоит из двух запросов).
источник
order by
происходит после того, как переменная@x
была оценена. Попробуйте поэкспериментировать, заказав другие столбцы. Также экспериментируйте с обоимиdesc
иasc
. Вы увидите, что много раз они терпят неудачу, и единственные времена, когда это работает, это по счастливой случайности из-за того, что порядок вашего исходного «выбора» имеет тот же порядок, что и порядокorder by
. Смотрите мое решение и / или решение Swamibebop.ASC
/DESC
изменил бы порядок, в котором эти числа были пронумерованы (от наименьшего к наибольшему или наоборот). Так что, похоже, что в этом случаеorder by
был оценен в первую очередь.Теперь он встроен в MySQL 8.0 и MariaDB 10.2:
источник