有一个表格的表格: t_news
- ID
- 标题
- 猫
每个新闻的类别不一致。也就是说,它可能是前 2 个新闻第一个类别,然后是第三个,然后是第五个,等等。
每个类别需要获得 5 条新闻,按日期排序。
什么是输出应该类似于以下(例如,3 条新闻,类别 3)
id title cat
1 News1 1
2 News2 1
3 News3 1
4 News4 2
5 News5 2
6 News6 2
7 News7 3
8 News8 3
9 News9 3
在 MySQL 中,您可以使用变量来创建行号列:
SELECT id, title, cat
FROM ( SELECT id,
title,
cat,
@r:=IF(@cat = cat, @r+1, 1) AS RowNum ,
@cat:= cat AS Cat2
FROM t_news,
(SELECT @cat:= 0) AS cat,
(SELECT @r:= 0) AS r
ORDER BY cat, id
) t
WHERE RowNum <= 5;
如果 cat 列与 @cat 变量(从前一行设置)相同,则键位于每一行,然后行号递增 1。否则它将重置为 0。增量的顺序由子查询中的 order by 子句设置(我使用了 ID,因为您发布的架构不包含日期列)。
总代码:
SELECT id, title, cat, from_unixtime(date) `date` FROM (
SELECT id, title, cat, `date`
FROM
(
SELECT id, title, cat, `date`, @r:=IF(@cat = cat, @r+1, 1) AS RowNum , @cat:= category AS Cat2
FROM news, (SELECT @cat:= 0) AS cat, (SELECT @r:= 0) AS r
WHERE hide=0
ORDER BY cat, `date` DESC, id
) t
WHERE RowNum <= 4 LIMIT 16
) t2
ORDER BY `date` DESC;
@GarethD,谢谢 =)