#mysql
#mysql
Вопрос:
У меня есть две таблицы, одна для содержимого и одна для изображений.
Моя проблема в том, что изображение не является обязательным полем, но если изображение существует, столбец i.type должен быть некоторым указанным числом.
Запрос, который я использую, также возвращает содержимое из некоторых других таблиц с тем же идентификатором (я знаю, что это неправильно, но это все, что у меня есть сейчас).
Вот запрос
SELECT e.*, i.imagem, i.folder
FROM event e
LEFT JOIN img_rel i ON e.id = i.rel
WHERE e.slug = 'slug'
AND e.type = 'even';
Есть ли какой-нибудь способ сделать это или мне придется фильтровать его с помощью PHP?
Комментарии:
1. Не совсем понятно, о чем вы спрашиваете. Но я подозреваю, что вы хотите включить предикат on
i.type
в предложение ON, напримерON id.rel = e.id = i.rel AND i.type = 'some specified number'
. (Включая предикат в предложение ON, он остается «внешним» соединением. Если вы поместите этот предикат вWHERE
предложение, это сведет на нет «внешность» объединения. Я подозреваю, что это проблема, с которой вы столкнулись. (Когда соответствующая строка не найдена, столбцы изi
списка ВЫБОРА будут равны НУЛЮ.)
Ответ №1:
Будет ли
join ... on ... and (i.imagem IS NULL or i.type = 'myspecialvalue')
быть тем, что вам нужно?
Комментарии:
1. 1 Я не уверен, как вас примут, не получив голосов, так что поставьте один на меня.
Ответ №2:
Вы можете использовать CASE
в своем запросе
SELECT
e.*,
CASE
WHEN i.imagem IS NOT NULL
AND i.type = 'your number'
THEN i.imagem
ELSE NULL
END AS imagem,
i.folder
FROM
event e
LEFT JOIN img_rel i
ON e.id = i.rel
WHERE e.slug = 'slug'
AND e.type = 'even';
Комментарии:
1. Разве это не было бы менее эффективным, чем просто добавление другого условия в предложение ON?
Ответ №3:
Вы можете использовать столько столбцов, сколько захотите, для предложения On объединения. Вы даже можете поместить статические фильтры в соединение.
Select *
From Table1 t1 Left Join
Table2 t2 On t1.col1 = t2.col2
And t1.col2 = t2.col2
And t1.col3 = 'something static'
Where t1.col1 = 'this will match both col1 and t2.col1'