2015-03-29 4 views
0

У меня есть 4 таблицы MySQL, sh_comenzi, sh_comenzi_prods, sh_delivery, sh_delivery_items.MySQL complex LEFT JOIN для имитации UNION как запрос

Данные таблицы выглядит следующим образом:

sh_comenzi стол:

id pid doc_date status deleted date_added date_modified 
1 12 1427534088 0  0  1427534088 1427534088 
2 14 1427534088 1  0  1427534088 1427534088 
3 17 1427534088 0  0  1427534088 1427534088 
4 1 1427534088 0  0  1427534088 1427534088 
5 2 1427534088 1  0  1427534088 1427534088 

sh_comenzi_prods стол:

id idc pOrder cPos fid idp quantity delivery_date 
1 2 aaa  1  1 2 100   1427534088 
2 2 aaa  2  1 89 100   1427534088 
3 5 qqq  1  2 10 100   1427534088 
4 5 qqq  2  2 11 100   1427534088 
5 5 qqq  3  2 10 100   1427534088 
6 5 qqq  4  2 14 100   1427534088 
7 4 1234q 1  1 135 100   1427534088 
8 5 123a 1  2 2 100   1427534088 

sh_delivery структура таблицы

id status date_added 
1 0  1427534088 
2 1  1427534088 
3 0  1427534088 
4 1  1427534088 

sh_delivery_items стол:

id delivery_id idc cPos 
1 1   1 1 
2 2   1 1 
3 4   5 1 
4 4   5 2 
5 4   5 4 

Я хочу иметь запрос MySQL, который показывает мне для выбранного sh_comenzi идентификатора (скажем sh_comenzi.id = 5) все записи из sh_comenzi_prods, которые не существуют в sh_delivery_items с условием sh_comenzi_prods.idc = sh_delivery_items.idc и sh_comenzi.status = 1 и sh_delivery.status = 0 , Теперь, для твердой части, чтобы те результаты, которые я хочу, чтобы иметь возможность добавлять все записи из sh_delivery_items с delivery_id = 4 и sh_delivery_items.idc = 5

Таблицы связаны друг друг с другом по этим критериям: - sh_comenzi.id = sh_comenzi_prods.idc - sh_delivery.id = sh_delivery_items.delivery_id - sh_comenzi_prods.idc = sh_delivery_items.idc

Может ли кто-нибудь дать мне один идеал запроса без UNION, который даст следующий результат?

delivery_id idc cPos 
4   5 1 
4   5 2 
4   5 4 
NULL  5 3 
NULL  2 2 

Запрос, используемый мной:

SELECT sh_delivery_items.delivery_id, sh_comenzi_prods.idc, sh_comenzi_prods.cPos 
     FROM sh_comenzi_prods 
     LEFT JOIN sh_comenzi ON sh_comenzi.id = sh_comenzi_prods.idc 
     LEFT JOIN sh_delivery_items ON (sh_delivery_items.idc = sh_comenzi_prods.idc AND sh_delivery_items.cPos = sh_comenzi_prods.cPos) 
     LEFT JOIN sh_delivery ON sh_delivery.id = sh_delivery_items.delivery_id 
     WHERE sh_comenzi.status=1 AND idc=5 AND (delivery_id=4 OR (sh_delivery_items.id IS NULL OR sh_delivery.status=0)) 
     ORDER BY sh_comenzi_prods.cPosasc 

Вот sqlfiddle: http://sqlfiddle.com/#!9/c775e/2

+0

Можете ли вы использовать соглашения об именовании для таблиц? sh_comenzi, sh_comenzi_prods не имеет никакого смысла и запутанности и сложности. –

+0

sh_comenzi - это заголовок заказов, а sh_comenzi_prods - структура таблицы строк. Я бы поместил sqlfiddle, но по какой-то причине это не сработало ... – rosuandreimihai

ответ

1

Ваши требования немного трудно следовать - поэтому выборочные данные и желаемые результаты всегда помогают вопрос.

Однако ваш запрос имеет возможный логический поток, который является использованием where с left join. Условия в where обычно включаются только в первую таблицу в серии left join. Итак, следующие действия могут делать то, что вы хотите:

SELECT sh_delivery_items.delivery_id, sh_comenzi_prods.idc, sh_comenzi_prods.cPos 
    FROM sh_comenzi_prods LEFT JOIN 
     sh_comenzi 
     ON sh_comenzi.id = sh_comenzi_prods.idc AND 
      sh_comenzi.status = 1 LEFT JOIN 
     sh_delivery_items 
     ON sh_delivery_items.idc = sh_comenzi_prods.idc AND 
      sh_delivery_items.cPos = sh_comenzi_prods.cPos LEFT JOIN 
     sh_delivery 
     ON sh_delivery.id = sh_delivery_items.delivery_id AND 
      (delivery_id = 4 OR sh_delivery.status = 0) 
    WHERE sh_comenzi_prods.idc = 5 
    ORDER BY sh_comenzi_prods.cPosasc 
+0

Я не мог обработать пример sqlfiddle, и именно поэтому мне пришлось выбирать жесткие и длинные объяснения .. – rosuandreimihai

+0

Представленный запрос не возвращает желаемого результаты .. – rosuandreimihai

+0

Я только что обновил вопрос с помощью sqlfiddle – rosuandreimihai