Mysql
 sql >> Database >  >> RDS >> Mysql

Errore di query MySQL con CASE e INNER JOIN

Non puoi scegliere un tavolo da unire in una dichiarazione del caso. Dovresti unire a sinistra entrambe le tabelle, quindi scegliere il valore da una di esse nel case dichiarazione, in questo modo:

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

Probabilmente non hai bisogno dell'ultima espressione (il ...as user_id uno), perché sarà uguale a a.user_id se è presente una riga in uno dei due api_twitter o api_foursquare che corrisponde a a.user_id .

Devi anche mettere il WHERE clausola dopo il FROM clausola:

MODIFICA: Tenendo conto dell'ottimo suggerimento di ypercube, la query sarebbe simile a questa:

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