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
      )