¿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 itemIDen 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=388es la primera fila, la 234segunda, 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 otraSELECTque obtenga todo del primero, pero ordena por la columna de clasificación (0 en este caso).fuente
t1yt2?xyy.La solución de Swamibebop funciona, pero al aprovechar la
table.*sintaxis, podemos evitar repetir los nombres de columna del internoselecty obtener un resultado más simple / más corto:Entonces eso te dará:
fuente
@r := @r + 1de 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 bysucede después de que la variable@xha sido evaluada. Intenta experimentar ordenando usando las otras columnas. También experimente con ambosdescyasc. 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/DESCcambiaría el orden en que se numeraron esos números (de menor a mayor o viceversa). Parece que en ese casoorder byse evaluó primero.Ahora está integrado en MySQL 8.0 y MariaDB 10.2:
fuente