복붙노트

[SQL] MySQL은 - 선택에 행 번호를 가져옵니다

SQL

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;

이것은 나에게이 같은 테이블의 각 항목 ID의 수를 제공합니다 :

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

나는, (234)이 두 번째, 항목 ID = 388은 최초의 행 있다는 등을 말할 수 있도록 (본질적으로, 주문의 단지 원시 카운트를 순위)뿐만 아니라, 행 번호를 얻으려면. 나는 결과 세트 등을받을 때 자바에서이 작업을 수행 할 수 있습니다 알고 있지만 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.이것 좀 봐.

    이것 좀 봐.

    귀하의 질의에 변경 :

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

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

  2. ==============================

    2.

    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;
    
  3. ==============================

    3.Swamibebop의 솔루션은 작동하지만 테이블을 활용하여 * 구문, 우리는 내부 선택의 열 이름을 반복하지 않도록하고 간단한 / 짧은 결과를 얻을 수 있습니다. :

    Swamibebop의 솔루션은 작동하지만 테이블을 활용하여 * 구문, 우리는 내부 선택의 열 이름을 반복하지 않도록하고 간단한 / 짧은 결과를 얻을 수 있습니다. :

    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;
    
  4. ==============================

    4.당신은 그것을 할 MySQL의 변수를 사용할 수 있습니다. 이 같은 뭔가 (하지만,이 두 개의 질의로 구성) 작동합니다.

    당신은 그것을 할 MySQL의 변수를 사용할 수 있습니다. 이 같은 뭔가 (하지만,이 두 개의 질의로 구성) 작동합니다.

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

    5.그것은 지금의 MySQL 8.0과 MariaDB 10.2에 내장 것 :

    그것은 지금의 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
    
  6. from https://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select by cc-by-sa and MIT license