복붙노트

[SQL] SELECT는 각 그룹에서 한 행을 반환 쿼리

SQL

SELECT는 각 그룹에서 한 행을 반환 쿼리

이 제품 테이블 및 기록의 몇 백만이있다.

일반적으로 I 사용 : 나는 다음과 같은 목록 기록 할 :

SELECT id, 
       product_name, 
       store_id 
FROM product
GROUP BY store_id 
ORDER BY id.

현재 SQL 성능 문제가 발생. 이 같은 출력 결과에 대한 SQL 쿼리가 필요합니다.

해결법

  1. ==============================

    1.해결할 수있는 문제이, 나는 각 STORE_ID에 대한 (열이 AUTO_INCREMENTed이라고 가정) 별도 최신 ID를 가져 하위 쿼리에 합류하는 것입니다 추천 하나에 많은 대안이있다.

    해결할 수있는 문제이, 나는 각 STORE_ID에 대한 (열이 AUTO_INCREMENTed이라고 가정) 별도 최신 ID를 가져 하위 쿼리에 합류하는 것입니다 추천 하나에 많은 대안이있다.

    SELECT  a.*
    FROM    tableName a
            INNER JOIN
            (
                SELECT  store_ID, MAX(ID) max_ID
                FROM    tableName
                GROUP BY store_ID
            ) b ON a.store_ID = b.store_ID AND
                    a.ID = b.max_ID
    

    ID 및 STORE_ID : 더 나은 성능을 위해,이 컬럼에 인덱스를 가지고해야합니다.

    UPDATE 1

    당신이 모든 기록에 대한 제한이하려는 경우, 다음이를 사용,

    SELECT ID, product_Name, store_ID
    FROM   tableName a
    WHERE
      (
         SELECT COUNT(*) 
         FROM   tableName b
         WHERE  b.store_ID = a.store_ID AND b.ID >= a.ID
      ) <= 2;
    
  2. ==============================

    2.

    SELECT store_id,id,product_name FROM table_name
    WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY store_id)
    ORDER BY id
    

    이 작업을해야합니다 당신은 당신의 REQ에 따라 하나 STORE_ID 또는 ID를 기준으로 주문할 수 있습니다.

  3. ==============================

    3.이 좀보십시오 :

    이 좀보십시오 :

    SELECT * FROM YOURTABLE B
    JOIN (SELECT MAX(ID) MX FROM YOURTABLE GROUP BY STORE_ID) A
    ON  A.STORE_ID = B.STORE_ID
    AND B.ID = A.MX
    GROUP BY B.STORE_ID
    ;
    
  4. from https://stackoverflow.com/questions/14375099/select-query-return-1-row-from-each-group by cc-by-sa and MIT license