У меня есть 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
Можете ли вы использовать соглашения об именовании для таблиц? sh_comenzi, sh_comenzi_prods не имеет никакого смысла и запутанности и сложности. –
sh_comenzi - это заголовок заказов, а sh_comenzi_prods - структура таблицы строк. Я бы поместил sqlfiddle, но по какой-то причине это не сработало ... – rosuandreimihai