항목을 정렬하면 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
답변
