Запрос с несколькими объединениями вернет только одно из моих оставленных объединений - PullRequest
0 голосов
/ 19 ноября 2010

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

Вопрос такой:

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 работает, когда я объединяю три запроса.

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

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Если вы попытаетесь поместить предложение 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 голосов
/ 19 ноября 2010

Вы уверены, что ваши выводы верны? Нулевые значения появятся в той же строке , поэтому, когда нет записей, где term_data.tid = = tn.tid и term_data.vid в (5, 8), вы получите только записи для tdv6 , Tid и / или урегулирование_month будет НЕДЕЙСТВИТЕЛЕН для этих записей.

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

...