Mysql 多个 table 加入特例
Mysql multiple table join special case
这是我的场景:我有 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
希望我说清楚了。有什么办法可以达到这个结果吗? left、right、outer join、union我都试过了,网上也试过了,就是不能用关键字表示,还是找不到答案。我希望你们明白。感谢您的帮助!
这看起来像是两个 INNER JOIN
的 UNION
。一个从 stock
获取信息并在 sales_item
的列中具有 NULL
值,另一个从 sales_item
获取信息并在 NULL
的列中具有 NULL
=13=].
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
您的示例中的所有空值表明您正在尝试将两个完全不同的结果集连接在一起:将商品与库存连接起来并获取所有数据,然后将商品与销售额连接起来 return所有这些数据。棘手的是,您在所需的连接 table 中有两种不同的结果。两个集合唯一的共同点是项目 ID 和名称。
并集(这是您将要使用的)要求两个集合具有相同的列数。但是,您的集合具有不同数量的列,并且几乎没有重叠。因此,您必须明确 "select" 一些不存在的列作为占位符。所以你的最终查询应该是这样的:
完成您有两个连接语句的部分:
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 中省略一些 table 引用并使用不同的连接语法来更短一些,但您明白了。您想要在此处执行的确切连接类型取决于您的潜在问题,因此我只是猜测一个普通的 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
这是我的场景:我有 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
希望我说清楚了。有什么办法可以达到这个结果吗? left、right、outer join、union我都试过了,网上也试过了,就是不能用关键字表示,还是找不到答案。我希望你们明白。感谢您的帮助!
这看起来像是两个 INNER JOIN
的 UNION
。一个从 stock
获取信息并在 sales_item
的列中具有 NULL
值,另一个从 sales_item
获取信息并在 NULL
的列中具有 NULL
=13=].
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
您的示例中的所有空值表明您正在尝试将两个完全不同的结果集连接在一起:将商品与库存连接起来并获取所有数据,然后将商品与销售额连接起来 return所有这些数据。棘手的是,您在所需的连接 table 中有两种不同的结果。两个集合唯一的共同点是项目 ID 和名称。
并集(这是您将要使用的)要求两个集合具有相同的列数。但是,您的集合具有不同数量的列,并且几乎没有重叠。因此,您必须明确 "select" 一些不存在的列作为占位符。所以你的最终查询应该是这样的:
完成您有两个连接语句的部分:
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 中省略一些 table 引用并使用不同的连接语法来更短一些,但您明白了。您想要在此处执行的确切连接类型取决于您的潜在问题,因此我只是猜测一个普通的 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