mysql - numerar - sql server obtener numero de fila




MySQL-Obtenga el número de fila en seleccionar (3)

¿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:[email protected]+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:[email protected]+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;

SELECT @rn:[email protected]+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;




row-number