[mysql] MySQL-선택시 행 번호 가져 오기

항목을 정렬하면 select 문을 실행하고 행 번호를 얻을 수 있습니까?

나는 이와 같은 테이블을 가지고있다 :

mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| orderID     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| itemID      | bigint(20) unsigned | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

그런 다음이 쿼리를 실행하여 ID별로 주문 수를 얻을 수 있습니다.

SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;

이것은 나에게 다음 itemID과 같이 테이블에서 각각의 수를 제공 합니다.

+--------+------------+
| itemID | ordercount |
+--------+------------+
|    388 |          3 |
|    234 |          2 |
|   3432 |          1 |
|    693 |          1 |
|   3459 |          1 |
+--------+------------+

나는 또한 행 번호를 얻고 싶습니다. 그래서 itemID=388첫 번째 행, 234두 번째 등 이라고 말할 수 있습니다 (실제로 카운트가 아닌 주문의 순위). 결과 세트를 다시 가져올 때 Java 로이 작업을 수행 할 수 있다는 것을 알고 있지만 SQL에서 순수하게 처리 할 수있는 방법이 있는지 궁금합니다.

최신 정보

순위를 설정하면 순위가 결과 집합에 추가되지만 제대로 정렬되지 않습니다.

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)



답변

이것 좀 봐 .

쿼리를 다음과 같이 변경하십시오.

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC;
SELECT @rank;

마지막 선택은 당신의 수입니다.


답변

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;


답변

Swamibebop의 솔루션은 작동하지만 table.*구문 을 활용 하면 내부의 열 이름을 반복하지select 않고 더 간단하고 짧은 결과를 얻을 수 있습니다.

SELECT @r := @r+1 , 
       z.* 
FROM(/* your original select statement goes in here */)z, 
(SELECT @r:=0)y;

그래서 그것은 당신에게 줄 것입니다 :

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;


답변

MySQL 변수를 사용하여 수행 할 수 있습니다. 이와 같은 것이 작동해야합니다 (두 개의 쿼리로 구성되어 있음).

SELECT 0 INTO @x;

SELECT itemID, 
       COUNT(*) AS ordercount, 
       (@x:=@x+1) AS rownumber 
FROM orders 
GROUP BY itemID 
ORDER BY ordercount DESC; 


답변

이제 MySQL 8.0 및 MariaDB 10.2에 내장되어 있습니다.

SELECT
  itemID, COUNT(*) as ordercount,
  ROW_NUMBER OVER (PARTITION BY itemID ORDER BY rank DESC) as rank
FROM orders
GROUP BY itemID ORDER BY rank DESC


답변