2012-01-08 17 views
2

私はaという名前のテーブルと、異なるAPI(twitter、foursquare)のデータを持つテーブルを持っています。この例では、a.api_typeの値 bになるはずです。私が最後に望むのは、アクティブなAPI(api_foursquareまたはapi_twitterのいずれか)から正しいアバターを取得できることです。CASEとINNER JOINのMySQLクエリエラー

私はこれをこのクエリでしばらく働かせようとしていますが、このエラーが発生しています。 SQLは、私の最強のポイントではありませんので、この問題を解決する方法上の任意のヒントは素晴らしいことだ:)

"[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 

    INNER JOIN b ON b.user_id = a.user_id at line 11" 

SELECT a.user_id, 
     a.api_type, 
     b.avatar, 
     b.user_id 
(CASE 
     WHEN a.api_type = 0 THEN api_foursquare 
     WHEN a.api_type = 1 THEN api_twitter 
END) as b 
FROM a WHERE a.cookie_hash = :cookie_hash 
INNER JOIN b ON b.user_id = a.user_id 

答えて

5

あなたがすることはできませんcase文で結合するテーブルを選択します。あなたは、両方のテーブルに左に参加し、このように、case文でそれらのいずれかの値を選択する必要があります。ですので、

SELECT a.user_id, 
     a.api_type, 
     (case WHEN a.api_type = 0 THEN b.avatar ELSE c.avatar END) as avatar, 
     (case WHEN a.api_type = 0 THEN b.user_id ELSE c.user_id END) as user_id 
FROM a 
    LEFT OUTER JOIN api_foursquare b ON b.user_id = a.user_id 
    LEFT OUTER JOIN api_twitter c ON c.user_id = a.user_id 
WHERE a.cookie_hash = :cookie_hash 

あなたはおそらく最後の式を必要としない(...as user_id 1) a.user_idと一致する行がapi_twitterまたはapi_foursquareにある場合は、a.user_idになります。

あなたはまた、FROM句の後WHERE句を配置する必要があります:

EDIT:アカウントypercubeの偉大な提案を考慮して、クエリは次のようになります。

SELECT a.user_id, 
     a.api_type, 
     COALESCE(b.avatar, c.avatar) as avatar 
FROM a 
    LEFT OUTER JOIN api_foursquare b ON b.user_id = a.user_id AND a.api_type = 0 
    LEFT OUTER JOIN api_twitter c ON c.user_id = a.user_id and a.api_type = 1 
WHERE a.cookie_hash = :cookie_hash 
+0

最初の 'ON'条件に' AND a.api_type = 0'を追加します(2番目の '= 1')。 –

+1

次に、' COALESCE(b.avatar、c.avatar)as avatar'を使用して、 –

+0

@ypercube素晴らしい提案!私はそれを組み込む答えを編集しました。私は、クエリがより読みやすく、さらに多くのAPIタイプのテーブルを追加する方が簡単だと思います。ありがとう! – dasblinkenlight

0

あなたがb.user_id後と(CASEの前にカンマが必要です

SELECT a.user_id, 
    a.api_type, 
    b.avatar, 
    b.user_id, 
    (CASE 
      WHEN a.api_type = 0 THEN api_foursquare 
      WHEN a.api_type = 1 THEN api_twitter 
    END) as b 
FROM a WHERE a.cookie_hash = :cookie_hash 
    INNER JOIN b ON b.user_id = a.user_id 
+0

いいえ、それはすることができますこのように働く。 –