Mysql
 sql >> Base de données >  >> RDS >> Mysql

Erreur de requête MySQL avec CASE et INNER JOIN

Vous ne pouvez pas choisir une table à joindre dans une instruction case. Vous devez joindre à gauche les deux tables, puis choisir la valeur de l'une d'entre elles dans le case déclaration, comme celle-ci :

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

Vous n'avez probablement pas besoin de la dernière expression (le ...as user_id un), car il va être égal à a.user_id s'il y a une ligne dans l'un ou l'autre api_twitter ou api_foursquare qui correspond à a.user_id .

Vous devez également mettre le WHERE clause après le FROM clause :

MODIF : En tenant compte de l'excellente suggestion d'ypercube, la requête ressemblerait à ceci :

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