2012-01-27 3 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 в таблице уведомлений, потому что таблицы отзывов и обзоров_отчета очищаются каждый день свежими данными. Процесс, вероятно, будет переписан позже, чтобы не убивать, а добавлять только новые элементы.

ответ

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

Вы можете протестировать его с курса. Но вторая запись означает, что сначала будет вычисляться производная таблица (с результатами после группы), и эта производная таблица будет присоединена к таблице обзоров. –

Смежные вопросы