从单个表中选择有条件限制的数据

时间:2013-08-12 09:43:30

标签: mysql sql

有一张表格: 的 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

2 个答案:

答案 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,谢谢=)