2010-05-24 16 views
15

ho questa domandaMysql LEFT JOIN risultato nullo

SELECT articles.*, 
     users.username AS `user` 
FROM `articles` 
LEFT JOIN `users` ON articles.user_id = users.id 
ORDER BY articles.timestamp 

Fondamentalmente si restituisce l'elenco degli articoli e il nome utente che l'articolo è associato. Ora se non vi è alcuna voce nella tabella utenti per un particolare ID utente, la variabile users è NULL. Esiste comunque la possibilità che, se nullo, restituisca qualcosa come "Utente non trovato"? o dovrei farlo usando php?

risposta

33

Usa:

SELECT a.*, 
      COALESCE(u.username, 'User Not Found') AS `user` 
    FROM ARTICLES a 
LEFT JOIN USERS u ON u.id = a.user_id 
ORDER BY articles.timestamp 

Documentazione:

Il motivo per scegliere COALESCE oltre IF o IFNULL è che COALESCE è standard ANSI, mentre gli altri metodi non sono implementato in modo affidabile su altri database. Vorrei usare CASE prima di guardare IF, perché ancora: CASE è uno standard ANSI, rendendo più semplice il porting della query ad altri database.

+0

gota aspettare 8 minuti per accettare ...: P – Ozzy

1

È possibile utilizzare IF() dove in Oracle si sarebbe utilizzato la decodifica.

Così

SELECT articles.*, IF(users.username IS NULL, 'No user found', users.username) AS `user` 
FROM `articles` LEFT JOIN `users` ON articles.user_id = users.id 
ORDER BY articles.timestamp 

dovrebbe funzionare. Nota: non ho mysql a portata di mano, quindi non ho testato la query. Ma dovrebbe funzionare con piccole modifiche se fallisce. Non downvote;)

3

È possibile utilizzare la funzione IFNULL:

SELECT articles.*, IFNULL(users.username, 'User Not Found') AS `user` 
FROM `articles` LEFT JOIN `users` ON articles.user_id = users.id 
ORDER BY articles.timestamp 
0

SELECT articles.*, 
     IFNULL(users.username,'User Not Found') AS `user` 
FROM `articles` 
LEFT JOIN `users` ON articles.user_id = users.id 
ORDER BY articles.timestamp 
+0

doppi apici su utente non trovato? ;) –

+0

Non consigliato. :) –