반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL 하나의 쿼리 PHP에서 여러 mysql INSERT 문 (0) | 2021.01.23 |
---|---|
MySQL DBX 오류 : 드라이버를 제대로 초기화 할 수 없습니다. (0) | 2021.01.23 |
MySQL 두 필드의 합계로 정렬 (0) | 2021.01.23 |
MySQL Windows Vista에서 mysqldump .sql 파일을 MySQL 데이터베이스로로드하는 방법 (0) | 2021.01.23 |
MySQL Postgresql에서 MySQL의 ORDER BY FIELD () 시뮬레이션 (0) | 2021.01.23 |
댓글