Posso executar uma instrução select e obter o número da linha se os itens estiverem classificados?
Eu tenho uma tabela como esta:
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 esta 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 um itemID
na tabela assim:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
Também quero obter o número da linha, para poder dizer que itemID=388
é a primeira linha, a 234
segunda, etc. (essencialmente a classificação dos pedidos, não apenas uma contagem bruta). Eu sei que posso fazer isso em Java quando recupero o resultado, mas fiquei pensando se havia uma maneira de lidar com isso puramente no SQL.
Atualizar
A definição da classificação o adiciona ao conjunto de resultados, mas não está devidamente ordenado:
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
George
fonte
fonte
ORDER BY rank ASC
(ordenação por classificação na ordem ASCending). Eu acho que é isso que você quer dizer com , mas não devidamente ordenadoRespostas:
Dê uma olhada nisso .
Altere sua consulta para:
A última seleção é a sua contagem.
fonte
ORDER BY ordercount DESC
e, em seguida, agrupe toda a consulta em outraSELECT
que obtenha tudo da primeira, mas ordene pela coluna de classificação (0 neste caso).fonte
t1
et2
?x
ey
.A solução do Swamibebop funciona, mas, aproveitando a
table.*
sintaxe, podemos evitar a repetição dos nomes das colunas internasselect
e obter um resultado mais simples / mais curto:Então, isso lhe dará:
fonte
@r := @r + 1
de uma instrução select funciona, mas se estiver em um procedimento armazenado comdeclare r int; set r = 0;
, ele reclama (ativador := r +1
)?Você pode usar variáveis do MySQL para fazer isso. Algo assim deve funcionar (porém, consiste em duas consultas).
fonte
order by
acontece depois que a variável@x
foi avaliada. Tente experimentar solicitando usando as outras colunas. Também experimente com ambosdesc
easc
. Você verá que muitas vezes eles falham e as únicas vezes em que funciona, é por pura sorte devido à ordem do seu "select" original ter a mesma ordem que a ordem deorder by
. Veja minha solução e / ou a solução Swamibebop.ASC
/DESC
mudará a ordem na qual esses números foram numerados (do menor para o maior ou vice-versa). Portanto, parece que nesse casoorder by
foi avaliado primeiro.Agora está embutido no MySQL 8.0 e MariaDB 10.2:
fonte