Mysql多表连接特例

时间:2017-05-25 15:09:22

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

这是我的情景:我有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

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

2 个答案:

答案 0 :(得分:1)

这看起来像两个UNION的{​​{1}}。一个获取INNER JOIN中的信息,stock列中的NULL值,另一个获取sales_item的信息,sales_item的信息来自NULL {1}}。

stock

答案 1 :(得分:0)

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

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

通过这些部分,你有两个连接语句:

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