2012-01-27 3 views
2

단계를 저장하고이 두 검색어를 결합하려고 시도하지만 최선의 방법에 대해 확신하지 못합니다. 기본적으로 첫 번째 쿼리는 시스템의 리뷰 목록을 가져오고 두 번째 쿼리는 알림이 전송되었는지 (보고 된 결과가 반환 된 경우)보고 있습니다.검색어 결합

GET 리뷰 :

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를 확인할 수없는 이유에 대해 궁금해하실 것입니다. 프로세스는 나중에 죽이지 않기 위해 다시 작성되지만 새 항목 만 추가 할 수 있습니다.

답변

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

+0

병합 대신 두 번째 방법을 사용하면 효율을 얼마나 높일 수 있습니까? 아마도 쿼리가 내 쿼리에서와 같이 매번 실행되는 대신 한 번만 실행되는 것 같습니다. – spyke01

+0

물론 테스트 할 수 있습니다. 그러나 두 번째 글쓰기는 파생 된 테이블이 먼저 계산되고 (그룹별로 결과가 있음)이 파생 테이블이 검토 테이블에 조인됨을 의미합니다. –