Mysql Left Join Null Результат

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

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

В основном он возвращает список статей и имя пользователя, с которым связана статья. Теперь, если в таблице пользователей нет записи для определенного идентификатора пользователя, users var имеет значение NULL. Есть ли способ сделать это, если его значение null возвращает что-то вроде "User Not Found"? или мне нужно будет сделать это с помощью php?

Ответ 1

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

   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, что упрощает перенос запроса в другие базы данных.

Ответ 2

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

Ответ 3

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

Итак,

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, поэтому я не тестировал запрос. Но он должен работать с небольшими изменениями, если он не работает. Не спускайте вниз;)

Ответ 4


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