sql - 为每个类别检索 2 个最新帖子

标签 sql optimization mysql greatest-n-per-group

假设我有 2 个表:blog_posts 和 categories。每篇博文只属于一个类别,所以这里的 2 个表之间基本上有一个外键。

我想从每个类别中检索 2 个最后的帖子,是否可以在单个请求中实现? GROUP BY 会将所有内容分组,并在每个类别中只留下一行。但我想要其中的 2 个。

执行 1 + N 查询很容易(N = 类别数)。首先检索类别。然后从每个类别中检索 2 个帖子。

我相信执行 M 个查询也很容易(M = 我想从每个类别中获得的帖子数)。第一个查询为每个类别选择第一个帖子(使用分组依据)。第二个查询检索每个类别的第二个帖子。等

我只是想知道是否有人对此有更好的解决方案。我真的不介意为此做 1+N 次查询,但出于好奇心和一般的 SQL 知识,我将不胜感激!

提前感谢谁可以帮助我。

最佳答案

看看这个 MySQL article关于如何处理任意复杂分组中的前 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

关于sql - 为每个类别检索 2 个最新帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1907534/

相关文章:

css - 如何优化 CSS background-image 和 background-position 属性

sql - 获取 2 个 mySQL 表差异的更简单方法?

mysql - 从某个时间戳获取总计

MYSQL查询对某些列的出现次数进行求和

sql - 奇怪的 SQL 结果

optimization - MySQL GROUP BY 优化

java - 我应该如何开始分析/优化我的 java 应用程序/oracle 数据库?

mysql - 在 Mysql 中,如何使用性能模式查找哪些查询导致 cpu% 增加了多少?

sql - 如何提高多对多 SQL 查询的性能?

php - MYSQL 和 PHP - 每个 IN 变量返回 1 个结果,即使变量不是唯一的