2012-01-27 17 views
2

ステップを保存してこれらの2つのクエリを結合しようとしましたが、どのように最善を尽くすかわかりません。基本的に、最初のクエリはシステムのレビューのリストを取得しており、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

どのように合体するのではなく、2番目の方法を組み合わせると効率が上がりますか?たぶんクエリは、クエリのような毎回ではなく、一度だけ実行されるようです。 – spyke01

+0

あなたはコースからそれをテストすることができます。しかし、2番目の書き込みは、派生テーブルが最初に計算され(グループの後に結果がある)、この派​​生テーブルがレビューテーブルに結合されることを意味します。 –