MySQL-получить номер строки на выбор



могу ли я запустить инструкцию select и получить номер строки, если элементы отсортированы?



у меня есть такая таблица:



mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| itemID | bigint(20) unsigned | NO | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+


затем я могу запустить этот запрос, чтобы получить количество заказов по ID:



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 является вторым и т. д. (По существу, рейтинг заказов, а не только a грубая оценка.) Я знаю, что могу сделать это на 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)
646   4  

4 ответов:

посмотри этой.

изменить ваш запрос:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC;
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;

решение Swamibebop работает, но, воспользовавшись table.* синтаксис, мы можем повторять имена столбцов внутреннего select и получить более простой / короткий результат:

SELECT @r := @r+1 , 
       z.* 
FROM(/* your original select statement goes in here */)z, 
(SELECT @r:=0)y;

так что даст вам:

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;

для этого можно использовать переменные MySQL. Что-то вроде этого должно работать (правда, он состоит из двух запросов).

SELECT 0 INTO @x;

SELECT itemID, 
       COUNT(*) AS ordercount, 
       (@x:=@x+1) AS rownumber 
FROM orders 
GROUP BY itemID 
ORDER BY ordercount DESC; 

Comments

    Ничего не найдено.