2012-06-20 14 views
6

私はテーブルがtable1の3つのカラムcolumn1, column2 and column3を持っていると言います。LEFT OUTER JOINとSUBSELECTのMySQL

column1およびcolumn2は、FOREIGN KEYで、2つの他のテーブルがあります。しかし、column3のデータはn個のテーブルからのものです。

私たちはFacebookを考えてみましょう。アクティビティを表示するには、user1 photoliked photo1またはuser1 statusliked status1のテーブルを保持することがあります。この場合、column3は特定のテーブルを持つFOREIGN KEYになることはできません。

第一の方法 - -

SELECT user_id, 
     verb_id, 
     CASE WHEN verb_id = photoliked THEN 
      (SELECT photo_name FROM photos WHERE photo_id = column3) -- getting the desired data from the third column 
     WHEN verb_id = statusliked THEN 
      (SELECT status FROM statustable WHERE status_id = column3) 
     ELSE '' END AS performedon 
FROM table1 
    JOIN table2 ON user_id = user_id -- joining the first column 
    JOIN table3 ON verb_id = verb_id -- joining the second column 

第二の方法 -

SELECT user_id, 
     verb_id, 
     CASE WHEN verb_id = photoliked THEN 
      p.photo_name 
     WHEN verb_id = statusliked THEN 
      s.status 
     ELSE '' END AS performedon 
FROM table1 
    JOIN table2 ON user_id = user_id -- joining the first column 
    JOIN table3 ON verb_id = verb_id -- joining the second column 
    LEFT JOIN photos p ON p.photo_id = column3 -- joining the column3 with specific table 
    LEFT JOIN statustable s ON s.status_id = column3 

質問

2通りの

は、今、実際のデータを取得する2つの方法がありますデータを取得する方が良いですか? と2つのクエリのどちらが安価ですか?

+0

可能な重複http://stackoverflow.com/a/10684539/1239506 –

+0

ありません、それは複製されません。その質問では、 'WHERE'節に' IN'があり、 'SUBSELECT'はメイン問い合わせのどの列にも依存しません。 – JHS

+0

2番目のクエリはより良いです... –

答えて

1

第二のverb_idをフィルタ処理しようとすると、その理由は、最初のものは何が含まれています相関サブクエリと呼ばれます。サブクエリには、マスタークエリのレコードとの相関があります。したがって、サブクエリは、マスタークエリの一致するレコードごとに1回実行する必要があります。あなたのケースでは、マスタークエリのverb_idの値が決まるまでサブクエリを実行することはできません。これは実行するクエリの多くです。

最初のクエリのEXPLAINにこの問題が示されているはずです。あなたがEXPLAINでそれを見ると、通常は赤い旗です。

1

私はそれがクエリに1回実行されるようJOINが速くなると思う、とも私は速くなりJOIN

SELECT user_id, 
    verb_id, 
    COALESCE(p.photo_name, s.status) AS performedon 
FROM table1 
    JOIN table2 ON user_id = user_id -- joining the first column 
    JOIN table3 ON verb_id = verb_id -- joining the second column 
    LEFT JOIN photos p ON verb_id = 'photoliked' AND p.photo_id = column3 -- joining the column3 with specific table 
    LEFT JOIN statustable s ON verb_id = 'statusliked' AND s.status_id = column3 
1

あなたは、このアプローチを使用することができます。

SELECT t.user_id, 
     t.verb_id, 
     p.photo_name AS performedon 
FROM table1 AS t 
    JOIN table2 AS t2 ON t2.user_id = t.user_id 
    JOIN table3 AS t3 ON t3.verb_id = t.verb_id 
    JOIN photos AS p ON p.photo_id = t.column3 
         AND t.verb_id = 'photoliked' 

UNION ALL 

SELECT t.user_id, 
     t.verb_id, 
     s.status 
FROM table1 AS t 
    JOIN table2 AS t2 ON t2.user_id = t.user_id 
    JOIN table3 AS t3 ON t3.verb_id = t.verb_id 
    JOIN statustable AS s ON s.status_id = t.column3 
          AND t.verb_id = 'statusliked' ;