Mysql Left Join Null Result - PullRequest
       9

Mysql Left Join Null Result

16 голосов
/ 24 мая 2010

У меня есть этот запрос

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

По сути, он возвращает список статей и имя пользователя, с которым связана статья. Теперь, если в таблице пользователей нет записи для определенного идентификатора пользователя, users var равен NULL. Есть ли способ сделать так, чтобы, если его ноль, он возвращал что-то вроде «Пользователь не найден»? или я должен был бы сделать это, используя php?

Ответы [ 4 ]

35 голосов
/ 24 мая 2010

Использование:

   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 

Документация:

Причиной выбора COALESCE вместо IF или IFNULL является то, что COALESCE является стандартом ANSI, тогда как другие методы не надежно реализованы в других базах данных. Я бы использовал CASE, прежде чем я посмотрю на IF, потому что снова - CASE - это стандарт ANSI, облегчающий перенос запроса на другие базы данных.

5 голосов
/ 24 мая 2010

Вы можете использовать функцию 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 
1 голос
/ 24 мая 2010

Вы можете использовать IF() там, где в Oracle вы бы использовали декодирование.

So

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 

Должно работать. Примечание: MySQL не удобен, поэтому не проверял запрос. Но должен работать с небольшими изменениями, если это не удается. Не отрицайте;)

0 голосов
/ 24 мая 2010

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
...