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