没有针对MySQL 4 进行测试,但在MySQL 5 中可以轻松完成。
您需要在您的表中添加某种PRIMARY KEY 才能使其正常工作。
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 记录(这将在结果集中给出5 x number of types 记录),而是想选择具有不同类型的5 最新记录(这将给出@987654336 @结果集中的记录),使用这个查询:
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 上有一个索引。