Mysql 组合查询
尝试保存一个步骤并结合这两个查询,但不确定如何以最佳方式进行。基本上,第一个查询是获取系统中的评论列表,第二个查询是查看是否发送了通知(如果返回了结果,则通知已发送) 获取评论:Mysql 组合查询,mysql,Mysql,尝试保存一个步骤并结合这两个查询,但不确定如何以最佳方式进行。基本上,第一个查询是获取系统中的评论列表,第二个查询是查看是否发送了通知(如果返回了结果,则通知已发送) 获取评论: SELECT r.*, coalesce( ( SELECT AVG(rr.rating) FROM `" . DBTABLEPREFIX . "reviews_ratings` rr WHERE rr.review_id = r.id
SELECT r.*,
coalesce( ( SELECT AVG(rr.rating)
FROM `" . DBTABLEPREFIX . "reviews_ratings` rr
WHERE rr.review_id = r.id
)
, ''
) AS rating,
FROM `" . DBTABLEPREFIX . "reviews` r
WHERE BELOW SELECT IS 0 RESULTS
检查通知是否存在(是的,我知道这本身不起作用):
关于如何正确地做到这一点,有什么想法吗?另外,如果您想知道为什么我们不能检查通知表上的r.id,因为每天都会用新数据清除reviews和reviews_ratings表。稍后可能会重写该过程,以不终止,而只添加新项。您可以使用相关子查询,使用
不存在
:
SELECT r.*,
coalesce( ( SELECT AVG(rr.rating)
FROM `" . DBTABLEPREFIX . "reviews_ratings` rr
WHERE rr.review_id = r.id
)
, ''
) AS rating,
FROM `" . DBTABLEPREFIX . "reviews` r
WHERE NOT EXISTS
( SELECT rn.*
FROM `" . DBTABLEPREFIX . "reviews_notifications` rn
WHERE rn.website_id = r.website_id
AND rn.post_id = r.post_id
)
另一个子查询可以从部分移动到:
SELECT
r.*,
coalesce( rr.rating, '' ) AS rating,
FROM `" . DBTABLEPREFIX . "reviews` r
LEFT JOIN
( SELECT
rr.review_id,
AVG(rr.rating) AS rating
FROM `" . DBTABLEPREFIX . "reviews_ratings` rr
GROUP BY rr.review_id
) AS rr
ON rr.review_id = r.id
WHERE NOT EXISTS
( SELECT rn.*
FROM `" . DBTABLEPREFIX . "reviews_notifications` rn
WHERE rn.website_id = r.website_id
AND rn.post_id = r.post_id
)
谢谢,这正是我想要的!通过做第二个而不是合并,这能提高多少效率?看起来查询可能只运行一次,而不是像我的查询中那样每次都运行一次。您可以在非正常情况下对其进行测试。但是第二次写入意味着将首先计算一个派生表(结果在group by之后),并且该派生表将连接到reviews表。可以为review的每一行运行内联查询(像您的查询一样)。这并不意味着它会变慢,这取决于很多因素。但它通常比较慢。如果你还想计算一个和,除了平均值。引擎将不得不为审阅表中的每一行运行2个子查询。谢谢,在以后的查询中我一定会记住这一点。
SELECT
r.*,
coalesce( rr.rating, '' ) AS rating,
FROM `" . DBTABLEPREFIX . "reviews` r
LEFT JOIN
( SELECT
rr.review_id,
AVG(rr.rating) AS rating
FROM `" . DBTABLEPREFIX . "reviews_ratings` rr
GROUP BY rr.review_id
) AS rr
ON rr.review_id = r.id
WHERE NOT EXISTS
( SELECT rn.*
FROM `" . DBTABLEPREFIX . "reviews_notifications` rn
WHERE rn.website_id = r.website_id
AND rn.post_id = r.post_id
)