mysql - 如何优化包含两个相同子查询的查询(聚合函数除外)?

标签 mysql sql

我正在尝试编写一个简单的查询,生成按以下两项排名的图书列表:最新评论和评论总数。为了计算每本书的最近评论日期,我使用了一个子查询和 MIN 聚合函数。为了计算每本书的评论总数,我使用了完全相同的子查询,但使用了 COUNT 聚合函数。

这看起来效率不高。有没有一种方法可以将这些子查询合并到一个调用中,并且仍然可以访问查询的 HAVING 和 ORDER BY 子句中的两个聚合值?

这是伪查询:

SELECT DISTINCT
    (SELECT MIN(review.pub_date)
        FROM review
        WHERE book.id = review.book_id
        AND ...
        AND ...
        AND ...
    ) AS most_recent_date,
    (SELECT COUNT(review.pub_date)
        FROM review
        WHERE book.id = review.book_id
        AND ...
        AND ...
        AND ...
    ) AS review_count,
    book.id, book.pub_date, book.title, book.author
FROM book
INNER JOIN review
    ON (review.book_id = book.id)
WHERE (
    ...
)
HAVING (most_recent_date > '$DATE')
ORDER BY review_count DESC

我尝试将它们合并为一个并将聚合函数从子查询移动到 HAVING 和 ORDER BY 子句中,但我无法通过这种方式检索任何结果。

提前致谢。

最佳答案

我不认为你需要子查询来做到这一点:

select 
    book.id, book.pub_date, book.title, book.author, 
    min(review.pub_date) as most_recent_date, -- are you sure you want "min"? ("max" makes more sense to me) 
    count(review.pub_date) as review_count
from book
    left join review on book.id = review.book_id
where ... -- Define here any conditions, including those inside the subquery
group by book.id
having most_recent_date > ?
order by review_count desc

优化它的其他方法是使用您想要的结果创建临时表,然后将结果拉到您的查询中。

关于mysql - 如何优化包含两个相同子查询的查询(聚合函数除外)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24471035/

相关文章:

php - WordPress - 通过并发 AJAX 调用更新帖子元时主键的重复条目

mysql - Hibernate:向mysql数据库添加日期属性,它将作为前一天插入数据库

mysql - 按总计 SQL 对周结束数字进行分组;每月;年初至今的数字

mysql - 如何编写 SQL 来转换表,使行变为列,反之亦然

php - PHP 中无休止的查询/循环?

php - 在 PHP 中,我应该使用今天的日期函数还是 MySQL 中的 curdate()?

PHP PDO fetchAll() 在选择临时表时返回空数组

php - Mysql使用内存限制

sql - SQL(ORACLE):具有2个或更多相关/成对的容器查询“指针”的内部查询

mysql - 和盟Mysql