检索每个类别的 2 个最新帖子
-
19-09-2019 - |
题
假设我有 2 张桌子:博客帖子和类别。每篇博客文章只属于一个类别,因此这里的两个表之间基本上有一个外键。
我想检索每个类别的 2 个最新帖子,是否可以在单个请求中实现此目的?GROUP BY 会将所有内容分组,并在每个类别中只留下一行。但我想要其中 2 个。
执行 1 + N 查询(N = 类别数)很容易。首先检索类别。然后从每个类别中检索 2 个帖子。
我相信执行 M 个查询也很容易(M = 我想要从每个类别中获得的帖子数量)。第一个查询选择每个类别的第一个帖子(带有分组依据)。第二个查询检索每个类别的第二个帖子。ETC。
我只是想知道是否有人对此有更好的解决方案。我真的不介意为此执行 1+N 查询,但出于好奇心和一般 SQL 知识,我们将不胜感激!
预先感谢谁可以帮助我解决这个问题。
解决方案
看看这个 MySQL 文章 关于如何处理任意复杂分组中的前 N 个事物;这是好东西。你可以试试这个:
SET @counter = 0;
SET @category = '';
SELECT
*
FROM
(
SELECT
@counter := IF(posts.category = @category, @counter + 1, 0) AS counter,
@category := posts.category,
posts.*
FROM
(
SELECT
*
FROM test
ORDER BY category, date DESC
) posts
) posts
HAVING counter < 2
其他提示
SELECT p.*
FROM (
SELECT id,
COALESCE(
(
SELECT datetime
FROM posts pi
WHERE pi.category = c.id
ORDER BY
pi.category DESC, pi.datetime DESC, pi.id DESC
LIMIT 1, 1
), '1900-01-01') AS post_datetime,
COALESCE(
(
SELECT id
FROM posts pi
WHERE pi.category = c.id
ORDER BY
pi.category DESC, pi.datetime DESC, pi.id DESC
LIMIT 1, 1
), 0) AS post_id
FROM category c
) q
JOIN posts p
ON p.category <= q.id
AND p.category >= q.id
AND p.datetime >= q.post_datetime
AND (p.datetime, p.id) >= (q.post_datetime, q.post_id)
建立索引 posts (category, datetime, id)
为了做到这一点要快。
请注意 p.category <= c.id AND p.category >= c.id
破解:这使得 MySQL
使用 Range checked for each record
索引效率更高。
类似问题请参阅我博客中的这篇文章:
不隶属于 StackOverflow