有一张表格: 的 t_news
每个新闻的类别都不一致。也就是说,它可能是第一个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
答案 0 :(得分:2)
在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,因为您发布的模式不包含日期列)。
<强> Example on SQL Fiddle 强>
答案 1 :(得分:0)
总代码:
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,谢谢=)