Сравнение возвращает логическое значение (TRUE, FALSE или NULL) для каждой строки, для которой она была оценена.
Таким образом, foo IN (list)
не может (сам по себе) «производить» строку, которая недоступна в источнике строки.
(Вы говорите, что id = 2
«не доступен», мы принимаем, что означает, что не существует ни одна строка в user
, который удовлетворяет этот предикат.)
Вы можете производить набор результатов, как показано на рисунке, но это не делает требуется сравнение IN
.
Вам нужен источник строк, который гарантированно вернет нужные вам значения «id»; встроенный просмотр - удобный способ сделать это.
SELECT u.username
FROM (SELECT 1 AS id
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
) n
LEFT
JOIN user u
ON u.id = n.id
ORDER BY n.id
LEFT JOIN указывает внешнюю операцию соединения. То есть, если нет соответствующей строки из таблицы с правой стороны (user
), которая соответствует строке из таблицы с левой стороны (n
), тогда запрос вернет строку из n
вместе с NULL
значениями для всех столбцы от user
.
Вы можете заменить это значение NULL для имени пользователя, используя выражение в списке SELECT. Проверьте, является ли u.id
NULL (что означало бы, что не найдено подходящей строки), и возвратите что-то еще. Например, буква 0
.
SELECT IF(u.id IS NULL,'0',u.username) AS username
Это MySQL определенный синтаксис для ANSI-стандарт эквивалент
SELECT CASE WHEN u.id IS NULL THEN '0' ELSE u.username END AS username
Если вы хотите заменить все нулевые значения username
, а не только NULL значения, полученные при user
строка отсутствует:
SELECT IFNULL(u.username,'0') AS username
SELECT (CASE WHEN имя пользователя NULL THEN 0 end) как имя пользователя FROM – Mihai
@Mihai - или используйте ['IFNULL'] (http://dev.mysql.com/doc/refman/5.0/en/control-flow -f unctions.html # function_ifnull);) – slugonamission
ИЛИ coalesce .... – Mihai