MySQL의 4의
모든
은
MySQL 4
위해에서 테스트하지 못했지만,
MySQL 5
이 쉽게 수행 할 수 있습니다.
테이블이 작동하려면 테이블에 PRIMARY KEY
이 있어야합니다. - MySQL
에 GROUP
에 대한 N
행을 선택하는 방법
- Advanced row sampling :
SELECT l.*
FROM (
SELECT type,
COALESCE(
(
SELECT id
FROM mytable li
WHERE li.type= dlo.type
ORDER BY
li.type DESC, li.date DESC, li.id DESC
LIMIT 4, 1
), CAST(0xFFFFFFFF AS DECIMAL)) AS mid
COALESCE(
(
SELECT date
FROM mytable li
WHERE li.type= dlo.type
ORDER BY
li.type DESC, li.date DESC, li.id DESC
LIMIT 4, 1
), '9999-31-12') AS mdate
FROM (
SELECT DISTINCT type
FROM t_mytable dl
) dlo
) lo, t_mytable l
WHERE l.type >= lo.type
AND l.type <= lo.type
AND (l.date, l.id) >= (lo.mdate, lo.mid)
가 작동하는 방법에 대한보다 자세한 사항은 내 블로그에서이 항목을 참조하십시오.
이 솔루션을 구현하기 위해 PRIMARY KEY
를 추가 할 수없는 경우, 시스템 변수를 사용하여 효율성이 떨어지는 하나를 사용하려고 할 수 있습니다 : 그것은 여기에 설명 된 것
SELECT l.*
FROM (
SELECT @lim := 5,
@cg := -1
) vars,
mytable l
WHERE CASE WHEN @cg <> type THEN @r := @lim ELSE 1 END > 0
AND (@r := @r - 1) >= 0
AND (@cg := type) IS NOT NULL
ORDER BY
type DESC, date DESC
:
을
업데이트 :
당신이 (결과 집합에서 5 x number of types
기록을 줄 것이다) 각 유형 5
레코드를 선택, 대신 구별 유형과 5
최신 기록 (결과 집합에서 5
기록을 줄 것이다) 선택합니다하지 않으려면
, 이 쿼리를 사용하면 유형이 많이가있는 경우
SELECT date, type, title
FROM mytable m
WHERE NOT EXISTS
(
SELECT 1
FROM mytable mi
WHERE mi.date > m.date
AND mi.type = m.type
)
ORDER BY
date DESC
LIMIT 5
을,이 GROUP BY
을 사용하여, 당신은 date
에 대한 인덱스를 제공하는 것이 더욱 효율적입니다.
Gummo는 유형이 '2'로되어 있습니까? –
어, 좋은 지적 - 고정! –