1

在我解释我的问题之前,我将快速回顾一下表结构是如何的:

类型: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 并不是我的强项。

任何正确方向的帮助或指示将不胜感激!

谢谢!

更新:请注意,类别的数量不是静态的,并且会发生变化。

4

1 回答 1

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

您在“子查询”中执行此操作以模仿表,然后只需选择排名 <= 4 的行(您需要的行)。如果您需要更多或更少,您可以调整该数字。

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

于 2012-09-27T19:01:56.123 回答