source

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

gigabyte 2022. 9. 15. 22:55
반응형

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두 번째 등입니다(기본적으로 미가공 카운트뿐만 아니라 주문 순위).결과셋이 돌아오면 자바에서 할 수 있다는 것은 알고 있습니다만, 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;

Swimibebop의 솔루션은 작동하지만 구문을 이용하여 내부 컬럼 이름을 반복하는 것을 피할있습니다.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 변수를 사용하여 수행할 수 있습니다.이와 같은 것이 동작합니다(단, 2개의 쿼리로 구성됩니다).

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
SELECT RANK() OVER(ORDER BY Employee.ID) rank, forename, surname, Department.Name, Occupation.Name  
FROM Employee  
JOIN Occupation ON Occupation.ID = Employee.OccupationID  
JOIN Department ON Department.ID = Employee.DepartmentID 
WHERE DepartmentID = 2;

언급URL : https://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select

반응형