0

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

2 回答 2

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,因为您发布的架构不包含日期列)。

SQL Fiddle 示例

于 2013-08-12T10:03:31.750 回答
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,谢谢 =)

于 2013-08-12T12:00:37.483 回答