在我解释我的问题之前,我将快速了解表格结构:
类型: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并不是我的强项。
我们非常感谢任何正确方向的帮助或指示!
谢谢!
更新:请注意,类别数量不是静态的,而是会更改。
答案 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
排序。