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


181

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

1
나중에 참조 할 경우 : 순위 1에서 순위 5까지 ORDER BY rank ASC주문 하려면 (오름차순으로 순위 순으로)를 사용하십시오. 나는 당신이 무엇을 의미하는 것 같다 하지만 제대로 주문
BlueCacti

답변:


179

이것 좀 봐 .

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

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

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


1
결과 순위에 순위가 추가되지만 올바른 순서로 표시되지 않습니다. 결과가 업데이트 된 질문
George

1
를 유지 한 ORDER BY ordercount DESC다음 전체 쿼리를 다른 쿼리로 래핑하여 SELECT첫 번째 쿼리에서 모든 것을 가져 오지만 순위 열 (이 경우 0)을 기준으로 정렬합니다.
Mike Cialowicz

1
이것의 예를 보여줄 수 있습니까? 선택 물을 어떻게 포장합니까?
George

9
swamibebop의 답변을 확인하십시오
thaddeusmt

1
@MikeCialowicz,이 작동하지 않습니다 . 정답은 내 솔루션 또는 Swamibebop의 솔루션을 참조하십시오.
Pacerier

178
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;

1
명확하게 해주셔서 감사합니다. 이로 인해 내가 겪은 고장난 문제가 해결되었습니다.
thaddeusmt

1
고마워, 이것은 나에게 정말 유용했습니다 :) 결과 세트에서 행 '색인'을 얻는 더 간단한 방법이 없다는 것에 놀랐습니다 ... 그러나 어쨌든 이것은 편리했습니다.
rat

SELECT \ @rn : = \ @ rn + 1 AS rank, itemID, ordercount, \ @tot : = \ @ tot + ordercount의 첫 번째 select 문을 totalcount로 변경하여 증분 총계로 네 번째 행을 추가 할 수 있습니다. \ @tot의 초기 값을 정의하려면 t2 뒤에 추가해야합니다 : (SELECT \ @tot : = 0) t3. 미니 마크 다운 형식을 우회하는 데 사용해야하는 모든 \ @ 앞에있는 \를 삭제하십시오.
Jan Ehrhardt

2
누구 t1와 의 관련성을 설명 할 수 있습니까 t2?
Jared

2
@Jared, MySQL 구문에는 무언가가 필요합니다. 심지어 아무것도 할 수있다 xy.
Pacerier

31

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;

@r := @r + 1select 문에서 사용 하는 이유를 우연히 알고 있지만로 저장 프로 시저에있는 경우 declare r int; set r = 0;(on r := r +1)으로 불평 합니까?
Dan M.

@Pacerier, 두 번째 선택이 어딘가에서 보장되는 행의 순서입니까? order by 절없이 select에 의해 반환 된 행의 순서는 어디에서나 보장되지 않으며 가장 바깥 쪽의 선택은 정확히 내부 정렬 된 선택에서 선택하지만 예외 일 수 있습니다. 그렇지 않은 경우 Chibu의 Mike와 같은 결함이 있기 때문에 이것이 올바른 솔루션인지 어떻게 알 수 없습니다. 선택 순서가 레코드를 통해 번호를 매길 것이라는 보장은 없습니다.
Dan M.

ORDER BY가 필드 목록에 없을 때마다 작동하지 않는 이유를 알고 있습니까? 내 결과보기 : hastebin.com/aluqefunoy.rb
Winter

11

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

SELECT 0 INTO @x;

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

2
주의 하면 변수 가 평가 된 후에order by 발생 하기 때문에 작동하지 않습니다 . 다른 열을 사용하여 주문하여 실험 해보십시오. 또한 두 실험 과 . 여러 번 실패하고 작동하는 유일한 시간 은의 순서와 동일한 순서를 갖는 원래의 "선택"순서로 인해 순수한 운 입니다 . 내 솔루션 및 / 또는 Swamibebop의 솔루션을 참조하십시오. @xdescascorder by
Pacerier

@Pacerier 확실합니까? var / row num을 기준으로 정렬하면 결과 행의 순서를 변경했을 때 그러나 각 숫자는 같은 행 번호를 가졌습니다. 그러나 숫자 열로 주문하면 ASC/ DESC는 해당 숫자의 순서를 변경합니다 (가장 작은 숫자에서 큰 숫자로 또는 그 반대로). 이 경우 order by먼저 평가 된 것처럼 보입니다 .
Dan M.

1

이제 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.