MySQL – Obtém o número da linha em select

Posso executar uma instrução select e obter o número da linha se os itens forem classificados?

Eu tenho uma mesa assim:

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

Em seguida, posso executar essa consulta para obter o número de pedidos por ID:

 SELECT itemID, COUNT(*) as ordercount FROM orders GROUP BY itemID ORDER BY ordercount DESC; 

Isso me dá uma contagem de cada itemID na tabela assim:

 +--------+------------+ | itemID | ordercount | +--------+------------+ | 388 | 3 | | 234 | 2 | | 3432 | 1 | | 693 | 1 | | 3459 | 1 | +--------+------------+ 

Eu quero pegar o número da linha também, então eu poderia dizer que o itemID=388 é a primeira linha, 234 é o segundo, etc (essencialmente a sorting das ordens, não apenas uma contagem bruta). Eu sei que posso fazer isso em Java quando obtenho o conjunto de resultados de volta, mas eu queria saber se havia uma maneira de lidar com isso puramente no SQL.

Atualizar

Definir a sorting adiciona-a ao conjunto de resultados, mas não é ordenada corretamente:

 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) 

Dê uma olhada nisso .

Altere sua consulta para:

 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; 

A solução do Swamibebop funciona, mas tirando vantagem da syntax table.* , Podemos evitar a repetição dos nomes das colunas da select interna e obter um resultado mais simples / mais curto:

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

Então isso vai te dar:

 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; 

Você pode usar variables ​​do MySQL para fazer isso. Algo como isso deve funcionar (embora, consiste em duas consultas).

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