首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟UNION式查询的MySQL复杂左连接

模拟UNION式查询的MySQL复杂左连接
EN

Stack Overflow用户
提问于 2015-03-29 23:36:46
回答 1查看 196关注 0票数 0

我有4个MySQL表,sh_comenzish_comenzi_prodssh_deliverysh_delivery_items

表数据如下所示:

sh_comenzi表:

代码语言:javascript
复制
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表:

代码语言:javascript
复制
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表结构

代码语言:javascript
复制
id  status  date_added
1   0       1427534088
2   1       1427534088
3   0       1427534088
4   1       1427534088

sh_delivery_items表:

代码语言:javascript
复制
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 id (假设是sh_comenzi.id = 5)的所有来自sh_comenzi_prods的记录,这些记录在sh_delivery_items中不存在,条件是sh_comenzi_prods.idc = sh_delivery_items.idcsh_comenzi.status = 1sh_delivery.status = 0。现在,对于困难的部分,我希望能够使用delivery_id = 4sh_delivery_items.idc = 5添加来自sh_delivery_items的所有记录

这些表通过以下条件彼此关联:- sh_comenzi.id = sh_comenzi_prods.idc - sh_delivery.id = sh_delivery_items.delivery_id - sh_comenzi_prods.idc = sh_delivery_items.idc

谁能给我一个没有UNION的查询的想法,给出下一个结果?

代码语言:javascript
复制
delivery_id idc cPos
4           5   1
4           5   2
4           5   4
NULL        5   3
NULL        2   2

我使用的查询:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-03-29 23:41:52

您的需求有点难以满足--这就是为什么样本数据和期望的结果总是对问题有帮助。

但是,您的查询可能有一个逻辑流程,即结合使用whereleft joinwhere中的条件通常只出现在一系列left join条件中的第一个表中。因此,以下代码可能会执行您想要的操作:

代码语言:javascript
复制
    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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29331095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档