본문 바로가기
MySql

MySQL GROUP BY의 ORDER BY 및 LIMIT

by 베이스 공부 2021. 1. 23.
반응형

GROUP BY에서 레코드의 하위 집합을 가져 오려고합니다. 많은 미친 솔루션을 보았지만 너무 복잡해 보이지만 더 효율적인 방법이 있습니까?

SELECT user_id, GROUP_CONCAT(item_id ORDER BY `timestamp`) AS items 
FROM wb_user_book_current_item GROUP BY user_id

그래서 이것은 지금까지 괜찮은 모든 사용자의 모든 현재 항목을 반환합니다. 하지만 가장 최근 항목 10 개만 원합니다. GROUP_CONCAT ORDER BY 를 추가하면 도움이되지만 여전히 마지막 10 개의 레코드를 제공하지 않습니다.

수정

이와 같은 작업을 수행하고 user_id 를 하드 코딩하면 해당 사용자에 대해 원하는 결과를 얻을 수 있습니다. 문제는 user_id를 하드 코딩 할 필요가 없도록 결합하는 것입니다. 예를 들어 모든 사용자가 마지막 10 개 항목을 가질 수 있습니다.

SELECT GROUP_CONCAT(cp2.item_id) AS items 
FROM (SELECT cp.user_id, cp.item_id 
      FROM wb_user_book_current_item cp 
      WHERE cp.user_id=1 ORDER BY cp.`timestamp` 
      LIMIT 10) AS cp2 
GROUP BY cp2.user_id

 

해결 방법

 

그래서 여기에서 꽤 잘 작동하는 멋진 솔루션을 발견했습니다.


다음은 모두 합쳐진 것과 같습니다.

SET @num := 0, @user_id := '';

SELECT cp2.user_id, CONCAT(cp2.item_id) AS items
FROM (
   SELECT cp.user_id, cp.item_id,
   @num := IF(@user_id = cp.user_id, @num + 1, 1) AS row_number,
   @user_id := cp.user_id AS dummy
   FROM wb_user_curent_item AS cp
   ORDER BY cp.user_id ASC, cp.`timestamp` DESC
) AS cp2 WHERE cp2.row_number <= 10
GROUP BY cp2.user_id

따라서 기본적으로 LIMIT 를 사용하는 대신 number 증분을 사용하여 레코드를 제한합니다.

 

참조 페이지 https://stackoverflow.com/questions/13091457

 

 

반응형

댓글