我有一个博客 SQL 系统,其中包含这样的“帖子”表(id、主题、标题、内容、已创建)。
我想获取每个帖子主题的最后 3 个标题,以显示在表格中,但我没有得到它。
我试过这个 SQL 代码:
SELECT *
FROM posts
GROUP BY theme
ORDER BY created DESC
LIMIT 0,3
但这给了我表格的最后 3 个帖子!!!
你能帮我么?
提前致谢。
您在某些方面做得对,但在其他方面您不理解该GROUP BY
子句的用法。
以上LIMIT
适用于整个查询结果。此外,您还需要一个聚合函数GROUP BY
来应用 ,例如SUM
,AVG
等。您不能简单地SELECT *
期望按 分组theme
。
GROUP BY
返回您分组的每个项目的一行,例如,最新的,而不是三行。
因此,您需要根据分组依据的每个主题执行查询,但在这种情况下,您根本不需要分组依据。编写一个循环,为您需要的每个主题执行此查询:
SELECT *
FROM posts
WHERE theme = "your-theme"
ORDER BY created DESC
LIMIT 0,3
Josvic Zammit 的回答部分正确(我 +1),但您不必按主题执行查询。这是您可以在 MySQL 中执行此操作的一种方式,尽管在 PHP 或其他任何方式中“执行每个主题的查询”肯定会更容易。
SELECT * FROM
(
SELECT
IF(@prev != sq.theme, @rownum:=1, @rownum:=@rownum + 1) AS rownumber, @prev:=sq.theme, sq.*
FROM
(
SELECT
*
FROM
posts
, (SELECT @rownum:=0, @prev:=0) r
ORDER BY theme, created DESC
) sq
) q
WHERE q.rownumber <= 3
请注意,不幸的是,我现在无法对其进行测试,但它应该可以工作。另请注意,此查询可能比对每个主题执行更简单的查询要慢。