Запрос с несколькими объединениями вернет только одно из моих оставленных объединений

0

У меня возникли проблемы с запросом, проблема в том, что я три раза схожу из одной таблицы.

Этот вопрос задается следующим образом:

SELECT
      o.order_id, 
      n.title, 
      c.first_name,
      tdv5.tid,
      tdv6.name,
      tdv8.name AS settlement_month
 FROM orders o
      join products p           on o.product_id = p.nid
      join node n               on p.nid = n.nid
      join customers c          on o.customer_email = c.customer_email
      join term_node tn         on tn.nid = p.nid
      join term_data tdv6       on tn.tid = tdv6.tid AND tdv6.vid = 6
      left join term_data tdv5  on tn.tid = tdv5.tid AND tdv5.vid = 5
      left join term_data tdv8  on tn.tid = tdv8.tid AND tdv8.vid = 8

Когда я использую этот запрос, будет работать только первый JOIN с использованием tn.tid. Например, если единственное соединение последних трех:

join term_data tdv6       on tn.tid = tdv6.tid AND tdv6.vid = 6

Все будет хорошо. То же самое с

left join term_data tdv5  on tn.tid = tdv5.tid AND tdv5.vid = 5

И

left join term_data tdv8  on tn.tid = tdv8.tid AND tdv8.vid = 8

Однако, когда я их совмещаю, они не будут работать вообще. Только tdv6 работает, когда я объединяю три запроса.

Есть ли у вас предложения о том, что не так? Спасибо.

Теги:
join
left-join

2 ответа

1
Лучший ответ

Если вы попытаетесь поместить предложение WHERE, выполните следующие действия:

SELECT
      o.order_id, 
      n.title, 
      c.first_name,
      tdv5.tid,
      tdv6.name,
      tdv8.name AS settlement_month
 FROM orders o
      join products p           on o.product_id = p.nid
      join node n               on p.nid = n.nid
      join customers c          on o.customer_email = c.customer_email
      join term_node tn         on tn.nid = p.nid
      join term_data tdv6       on tn.tid = tdv6.tid
      left join term_data tdv5  on tn.tid = tdv5.tid
      left join term_data tdv8  on tn.tid = tdv8.tid
WHERE
      tdv6.vid = 6 and
      tdv5.vid = 5 and
      tdv8.vid = 8
  • 0
    Тогда он не будет возвращать никаких строк вообще. Мне нужны NULL-значения для левых соединений, которые ничего не возвращают.
  • 0
    Помещение условия в WHERE эффективно превращает ваше левое соединение во внутреннее соединение.
0

Вы уверены, что ваши выводы верны? Нулевые значения появятся в одной строке, поэтому, когда нет записей, где term_data.tid = = tn.tid и term_data.vid в (5, 8), вы получите только записи для tdv6. tid и/или sett_month будет NULL для этих записей.

Возможно, вы могли уйти, чтобы присоединиться к tdv6? Теперь это внутреннее соединение, что означает, что вам нужна запись в tdv6, чтобы получить записи из tdv5 или tdv8 с тем же самым типом.

  • 0
    Мне нужны все 3 информации из строк, если они доступны. Это возможно?
  • 0
    Вы пытались преобразовать (INNER) JOIN на tdv6 в левое соединение, как я предложил? Это должно делать свое дело.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню