mysql - 如何通过一对多关联日期进行排序并获得良好的性能?

标签 mysql sql

我的 MySQL 数据库中有上述模型:

Blogs (id: integer, name: varchar)
Posts (id: integer, name: varchar, blog_id: integer, created_at: date)

我想检索所有博客的列表,按具有最新帖子的博客排序。

我通过以下查询达到了这一点:

SELECT b.*, (SELECT p.created_at FROM posts p WHERE p.blog_id = b.id ORDER BY p.created_at DESC LIMIT 1) AS last_post_created_at FROM blogs b ORDER BY last_post_created_at DESC;

但是这个查询太慢了,我无法在我的应用程序上使用它。

你们有什么好的解决办法吗?

谢谢。

最佳答案

重写查询:

SELECT b.*, 
       p.last_post_created_at 
FROM blogs b 
  LEFT JOIN
    ( SELECT blog_id,
             MAX(created_at) AS last_post_created_at
      FROM posts  
      GROUP BY blog_id 
    ) AS p
    ON  p.blog_id = b.id  
ORDER BY last_post_created_at DESC;

(blog_id,created_at) 上的索引将有助于此版本和您的版本。

如果您想限制返回的博客数量,您应该在子查询中添加 ORDER BY 并在其中放置 LIMIT:

SELECT b.*, 
       p.last_post_created_at 
FROM blogs b 
  LEFT JOIN
    ( SELECT blog_id,
             MAX(created_at) AS last_post_created_at
      FROM posts  
      GROUP BY blog_id 
      ORDER BY last_post_created_at DESC
        LIMIT 100
    ) AS p
    ON  p.blog_id = b.id  
ORDER BY last_post_created_at DESC;

关于mysql - 如何通过一对多关联日期进行排序并获得良好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855290/

相关文章:

mysql - 给定 3 个表,我必须找到这个特定的查询,我该怎么做?

mysql - MySQL 中何时使用单引号、双引号和反引号

c# - SQL查询中的if语句?

MySQL实体关系图不显示外键链接

java - 如何根据用户插入的月数计算预计日期?

sql - 在 PostgreSQL 的查询中的窗口函数中使用别名

mysql - 如何在 phpMyAdmin 中使用 SQL 查询设置具有许多特殊字符的列值?

MySQL strip ' on where 查询

sql - 比较两个表中的数据

MySQL注入(inject)命令