2012-01-27 81 views
2

试图保存一个步骤,并结合这两个查询,但不知道如何去做最好的。基本上,第一个查询是获取我们系统中的评论列表,第二个查看是否发送了通知(如果有返回的结果,那么它已发送)。结合查询

获得评价:

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 

检查,如果存在的通知(是的,我知道这本身不工作):

SELECT rn.* 
FROM `" . DBTABLEPREFIX . "reviews_notifications` rn 
WHERE rn.website_id = r.website_id 
    AND rn.post_id = r.post_id 

,以便恰当地做到这一点的方式任何想法?此外,如果您想知道为什么我们无法在通知表上检查r.id,因为每天都会使用新数据清除评论和reviews_ratings表。该进程稍后可能会被重写为不杀,但仅添加新项目。

回答

1

您可以使用相关子查询,使用NOT EXISTS

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 
     ) 

其它子可以移动到FROM部分:

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 
    ) 
+0

感谢,正是我一直在寻找! – spyke01 2012-01-27 15:07:34

+0

通过做第二个,而不是合并,提高效率多少?它看起来像查询可能只运行一次,而不是每次像我的查询。 – spyke01 2012-01-27 23:24:21

+0

你可以在课程中测试它。但第二次写入意味着将首先计算派生表(结果在分组之后),并且此派生表将加入评论表。 – 2012-01-27 23:27:10