numero - MySQL-Obtenga el número de fila en seleccionar
sql server numero de fila (4)
¿Puedo ejecutar una declaración de selección y obtener el número de fila si los artículos 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 itemID
en la tabla como este:
+--------+------------+
| itemID | ordercount |
+--------+------------+
| 388 | 3 |
| 234 | 2 |
| 3432 | 1 |
| 693 | 1 |
| 3459 | 1 |
+--------+------------+
También quiero obtener el número de fila, así que podría decir que itemID=388
es la primera fila, 234
es el segundo, etc. (esencialmente el ranking de los pedidos, no solo un recuento bruto). Sé que puedo hacer esto en Java cuando recupero el resultado, pero me preguntaba si había una forma de manejarlo puramente en SQL.
Actualizar
Establecer el rango lo agrega al conjunto de resultados, pero no ordenado 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)
Echa un vistazo a this .
Cambie su consulta a:
SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID
ORDER BY ordercount DESC;
La solución de Swamibebop funciona, pero aprovechando la sintaxis table.*
, Podemos evitar repetir los nombres de columna de la select
interna y obtener un resultado más simple / más corto:
select @r := @r+1 , z.* from(
/* your original select statement goes in here */
)z, (select @r:=0)y;
Entonces eso 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;
Puedes usar una variable mysql para hacerlo. Algo así debería funcionar (aunque son dos consultas).
SELECT 0 INTO @x;
SELECT itemID, COUNT(*) as ordercount, (@x:=@x+1) as rownumber 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;