【问题标题】:Mysql multiple table join special caseMysql多表连接特例
【发布时间】:2017-10-26 07:17:06
【问题描述】:

这是我的场景:我有 3 张桌子:

items table

item_id |name
----------------
1       |item 1
2       |item 2
etc

stocks table

stock_id |item_id |quantity 
---------------------------
1        |1       |10
2        |2       |20
etc

sales_item tables
sales_item_id |sales_id |item_id |price
---------------------------------------
1             |1        |1       |100
2             |1        |2       |200
etc

这是我想要实现的连接结果:

joined table

item_id |name  |stock_id |quantity |sales_item_id |sales_id |price
-------------------------------------------------------------------
1       |item1 |1        |10       |null          |null     |null
1       |item1 |null     |null     |1             |1        |100
2       |item2 |2        |10       |null          |null     |null
2       |item2 |null     |null     |2             |1        |200

我希望我说清楚了。有没有办法达到这个结果?我试过左,右,外连接和联合,我已经尝试在互联网上搜索,只是它不能用关键字表示,但仍然找不到答案。我希望你们明白。感谢您的帮助!

【问题讨论】:

    标签: mysql join inner-join union outer-join


    【解决方案1】:

    这看起来像是两个INNER JOINs 中的UNION。一个从stock 获取信息并在sales_item 的列中具有NULL 值,另一个从sales_item 获取信息并在stock 的列中具有NULL

    SELECT i.item_id, i.name, s.stock_id, s.quantity, NULL AS sales_item_id, NULL AS sales_id, NULL AS price
    FROM items AS i
    JOIN stocks AS s ON s.item_id = i.item_id
    UNION
    SELECT i.item_id, i.name, NULL, NULL, si.sales_item_id, si.sales_id, si.price
    FROM items AS i
    JOIN sales_item AS si ON i.item_id = si.item_id
    

    【讨论】:

    • 最后一行,是 i.item_id 而不是 s.item_id 吗?
    【解决方案2】:

    您示例中的所有空值都表明您正在尝试将两个完全不同的结果集连接在一起:将商品与库存连接并获取所有数据,然后将商品与销售连接并返回所有数据。棘手的是您在所需的连接表中有两种不同的结果。两个集合唯一的共同点是项目 ID 和名称。

    联合(这是您将不得不使用的)要求两个集合具有相同的列数。但是,您的集合具有不同数量的列,并且几乎没有重叠。因此,您必须明确“选择”一些不存在的列作为占位符。所以你的最终查询应该是这样的:

    处理有两个连接语句的部分:

    SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity FROM items JOIN stocks ON stocks.item_id=items.id
    

    获取您的商品 + 库存信息。然后再加入获取销售数据:

    SELECT items.item_id, items.name, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id
    

    这是您需要连接的两个查询。当然,您可以通过在 select 中省略一些表引用并使用不同的连接语法来缩短这些时间,但您明白了。您想要在这里执行的确切连接类型取决于您的潜在问题,所以我只是猜测一个普通的 JOIN(它是 INNER JOIN 的别名)。

    现在您需要将它们与 UNION 放在一起,当您这样做时,您必须添加更多列作为占位符:

    SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity, null AS sales_item_id, null AS sales_id, null AS price FROM items JOIN stocks ON stocks.item_id=items.id
    UNION ALL
    SELECT items.item_id, items.name, null AS stock_id, null AS quantity, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id
    

    然后(如果需要)您可以进行排序:

    SELECT * FROM (
        SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity, null AS sales_item_id, null AS sales_id, null AS price FROM items JOIN stocks ON stocks.item_id=items.id
        UNION ALL
        SELECT items.item_id, items.name, null AS stock_id, null AS quantity, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id
    ) U order by item_id ASC
    

    【讨论】:

    • 在您的查询中,它不是 items.id,它是 items.item_id,而不是 sales.sales_item_id,sales.sales_id 而不是 sales,需要它的 sales_item
    猜你喜欢
    • 2011-01-27
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多