从同一个表中获取每个类别的4个最新行

时间:2012-09-27 18:51:08

标签: php mysql

在我解释我的问题之前,我将快速了解表格结构:

类型:MySQL 帖子/主题表:

 int      int**     UNIX Time     Int        Int
--------------------------------------------------
| id | category | postdate | topic_id | is_topic |
--------------------------------------------------
|  1 |    a     | 12345678 |    1     |     1    |
--------------------------------------------------
|  2 |    a     | 12345678 |    1     |     0    |
--------------------------------------------------
|  3 |    b     | 12345678 |    3     |     1    |
--------------------------------------------------
|  4 |    b     | 12345678 |    3     |     0    |
--------------------------------------------------
|  5 |    c     | 12345678 |    5     |     1    |
--------------------------------------------------
|  6 |    c     | 12345678 |    5     |     0    |
--------------------------------------------------

**我使用字母制作更容易阅读表格

我正在尝试检索每个类别的4个最新行,并且我能够使用GROUP BY从每个类别获得最新的1行,但我不知道如何为每个类别获取多个。

我尝试过这样的事情:

SELECT *
FROM posts p
WHERE NOT EXISTS
(
    SELECT *
    FROM posts
    WHERE category = p.category
    LIMIT 4
)

我也尝试过处理人们在SO上提供的其他一些答案,但我似乎无法使它们符合我的目的。

我完全迷失在这里,因为当涉及到这些更复杂的查询时,mysql并不是我的强项。

我们非常感谢任何正确方向的帮助或指示!

谢谢!

更新:请注意,类别数量不是静态的,而是会更改。

1 个答案:

答案 0 :(得分:2)

这样的事可能会这样做:

select * from
    (select 
         @rank:=CASE WHEN @ranked <> category THEN 1 ELSE @rank+1 END as rank,
         id,
         category,
         postdate,
         topic_id,
         is_topic
         @ranked:=category
     from 
          (select @rank := -1) a, 
          (select @ranked :=- -1) b, 
          (select * from posts order by category, postdate desc) c
    ) ranked_posts
where ranked_posts.rank <= 4

基本上这里发生的是我正在尝试创建一个存在于其他引擎中的“排名”函数(想到MS SQL)。

查询通过所有帖子,按类别排序,过期,并在类别更改时重置排名的每一行添加“排名”编号。像:

rank | category  
1          a     
2          a     
...
100        a     
1          b 
2          b
1          c
2          c
3          c

您在“子查询”中执行此操作以模拟表,然后只选择具有等级&lt; = 4的行(您需要的行)。如果您需要更多或更少,您可以调整该数字。

要记住的一件事是,排序很重要,否则排名将会全部搞砸。类别必须“分组”,因此ORDER BY category,然后按您的条件postdate desc排序。