2012-01-08 117 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之一),因为它将等于a.user_id,如果api_twitterapi_foursquare中有一行匹配a.user_id

你也必须把WHERE子句FROM条款后:

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'条件(和第二个'= 1')中添加'AND a.api_type = 0'。 – 2012-01-08 12:02:13

+1

然后你可以使用'COALESCE(b.avatar,c.avatar)AS avatar',等等 – 2012-01-08 12:03:33

+0

@ypercube很棒的建议!我编辑了答案来加入它。我认为查询更具可读性,并且为更多api类型添加表也更加容易。谢谢! – dasblinkenlight 2012-01-08 12:09:56

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

不,它可以”像这样工作。 – 2012-01-08 12:04:51