¿Puedo ejecutar una instrucción select y obtener el número de fila si los elementos están ordenados?
Tengo una mesa 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 | |
+-------------+---------------------+------+-----+---------+----------------+
Entonces puedo ejecutar esta consulta para obtener el número de pedidos por ID:
SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;
Esto me da un recuento de cada uno itemID
en la tabla de esta manera:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
También quiero obtener el número de fila, por lo que podría decir que itemID=388
es la primera fila, la 234
segunda, etc. (esencialmente la clasificación de los pedidos, no solo un recuento sin procesar). Sé que puedo hacer esto en Java cuando recupere el resultado, pero me preguntaba si había una manera de manejarlo solo en SQL.
Actualizar
Establecer el rango lo agrega al conjunto de resultados, pero no se ordena correctamente:
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
Jorge
fuente
fuente
ORDER BY rank ASC
(ordenar por rango en orden ASCending). Supongo que eso es lo que quiere decir con , pero no ordena correctamenteRespuestas:
Mira esto .
Cambie su consulta a:
La última selección es tu cuenta.
fuente
ORDER BY ordercount DESC
, y luego ajuste toda la consulta en otraSELECT
que obtenga todo del primero, pero ordena por la columna de clasificación (0 en este caso).fuente
t1
yt2
?x
yy
.La solución de Swamibebop funciona, pero al aprovechar la
table.*
sintaxis, podemos evitar repetir los nombres de columna del internoselect
y obtener un resultado más simple / más corto:Entonces eso te dará:
fuente
@r := @r + 1
de una instrucción select, pero si está en un procedimiento almacenado condeclare r int; set r = 0;
, se queja (encendidor := r +1
)?Puede usar variables MySQL para hacerlo. Algo como esto debería funcionar (sin embargo, consta de dos consultas).
fuente
order by
sucede después de que la variable@x
ha sido evaluada. Intenta experimentar ordenando usando las otras columnas. También experimente con ambosdesc
yasc
. Verá que muchas veces fallarán y las únicas veces que funciona, es por pura suerte debido a que el orden de su "selección" original tiene el mismo orden que el orden deorder by
. Vea mi solución y / o la solución de Swamibebop.ASC
/DESC
cambiaría el orden en que se numeraron esos números (de menor a mayor o viceversa). Parece que en ese casoorder by
se evaluó primero.Ahora está integrado en MySQL 8.0 y MariaDB 10.2:
fuente