Как мне объединить две таблицы, используя два столбца в качестве параметра для объединения?

#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'