#mysql
#mysql
Вопрос:
Приведенный ниже запрос дает мне 2 из 3 ответов, которые я ищу. При выборе подзапроса я получаю null вместо no
3 возможных значения для имени столбца isCyl могут быть пустыми, да, нет
Я не уверен, что подзапрос — лучший способ сделать это, но я не знаю, как еще повторно сформулировать запрос.
Таблица расписания содержит ряд столбцов, чтобы показать, какие задачи должны быть выполнены в задании. Связанные таблицы хранят результаты задач, если им было назначено выполнение. Итак, мне нужно проверить, была ли запланирована конкретная задача. Если это так, то мне нужно посмотреть, были ли результаты задачи записаны в связанную таблицу. Для краткости я показываю здесь только один из столбцов.
SELECT s.`reckey`,
if(s.cylinders="T",
(select
if(c.areckey is not null,
"yes",
"no"
)
from cylinders c where c.areckey = s.reckey limit 1
)
,""
) as isCyl
from schedule s
where s.assignmentDate between 20161015 and 20161016
order by s.reckey
Комментарии:
1. Подзапрос, скорее всего, не возвращает результата (null), если совпадение не найдено.
2. Пожалуйста, предоставьте некоторые образцы данных, ожидаемые результаты на основе образцов данных и выходные данные, предоставленные вашим запросом на основе образцов данных. Вероятно, вам нужно левое соединение, а не подзапрос.
3. Я тоже предпочитаю
LEFT JOIN
, но вы могли бы поместитьIF()
вокруг подзапроса вместо вокруг имени столбца.
Ответ №1:
Используйте a LEFT JOIN
, который возвращает NULL
для столбцов в дочерней таблице, когда совпадений нет.
SELECT s.reckey, IF(s.cylinders = "T",
IF(c.areckey IS NOT NULL, 'yes', 'no'),
"") AS isCyl
FROM schedule AS s
LEFT JOIN cylinders AS c ON c.areckey = s.reckey
WHERE s.assignmentDate between 20161015 and 20161016
ORDER BY s.reckey
Если в может быть несколько строк cylinders
с одинаковым areckey
значением, измените его на:
LEFT JOIN (select distinct areckey FROM cylinders) AS c on c.areckey = s.reckey
или используйте SELECT DISTINCT
в основном запросе.
Комментарии:
1. Спасибо за ясный и краткий пример. Небольшое дополнение с левым соединением (выберите distinct …. было именно тем, что мне было нужно. У меня может быть несколько записей во вложенной таблице. Мой результирующий набор в этом случае должен состоять из 27 строк. Без вашего дополнительного предложения мой результирующий набор составлял 67 строк. Итак, я узнал дополнительную вещь, и я ценю это.