У меня возникли проблемы с запросом, проблема в том, что я три раза схожу из одной таблицы.
Этот вопрос задается следующим образом:
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 работает, когда я объединяю три запроса.
Есть ли у вас предложения о том, что не так? Спасибо.
Если вы попытаетесь поместить предложение 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
Вы уверены, что ваши выводы верны? Нулевые значения появятся в одной строке, поэтому, когда нет записей, где term_data.tid = = tn.tid и term_data.vid в (5, 8), вы получите только записи для tdv6. tid и/или sett_month будет NULL для этих записей.
Возможно, вы могли уйти, чтобы присоединиться к tdv6? Теперь это внутреннее соединение, что означает, что вам нужна запись в tdv6, чтобы получить записи из tdv5 или tdv8 с тем же самым типом.