【发布时间】:2017-05-24 03:57:39
【问题描述】:
我完全了解这个问题并回答: https://stackoverflow.com/a/4796911/2307520 但这是一个有点不同的问题!
是的,我了解他们如何使用联合和两个左连接在 MySQL 中模拟简单的 FULL OUTER JOIN,但我的情况有点复杂(3 个表而不是 2 个),我很难找到修改该解决方案的方法满足我的需要。
CREATE TABLE item (`i_id` int, `i_name` varchar(70), b_id int null , s_id int null , PRIMARY KEY (i_id));
CREATE TABLE box (`b_id` int, `b_name` varchar(70), s_id int null , PRIMARY KEY (b_id) );
CREATE TABLE shelf (`s_id` int, `s_name` varchar(70) , PRIMARY KEY (s_id));
INSERT INTO shelf VALUES(1,'shelf1');
INSERT INTO shelf VALUES(2,'shelf2');
INSERT INTO shelf VALUES(3,'empty shelf');
INSERT INTO box VALUES(1,'box in s1 with item in it',1);
INSERT INTO box VALUES(2,'box without shelf',NULL);
INSERT INTO box VALUES(3,'empty box',2);
INSERT INTO item VALUES(1,'item a',1,NULL);
INSERT INTO item VALUES(2,'item b',1,NULL);
INSERT INTO item VALUES(3,'item c',2,NULL);
INSERT INTO item VALUES(4,'item in a shelf',NULL,1);
INSERT INTO item VALUES(5,'item without location',NULL,NULL);
item 可以放在盒子里,也可以单独放在架子上,或者两者都没有(未定义)。框可以在架子上或未定义。
理想情况下,我会使用这样的 SQL 查询:(如果我在 MySQL 中有 FULL OUTER JOIN)
SELECT *,coalesce(item.b_id,box.b_id) as b_id,coalesce(item.s_id,box.s_id,shelf.s_id) as s_id
FROM item
FULL OUTER JOIN box ON box.b_id=item.i_id
FULL OUTER JOIN shelf ON (shelf.s_id=item.s_id) OR (shelf.s_id=box.s_id)
WHERE ...
这将列出符合特定条件的所有条目(比如查看一个盒子在哪个架子上(如果有的话)以及里面的所有物品,或其他任何东西)
【问题讨论】:
-
我看不出架子和盒子之间连接的原因...为什么?
-
因为空盒子可以放在架子上,在物品放在那里之前
-
所以一个项目可能在一个盒子里,或者它可能只是坐在架子上。如果它在一个盒子里,那么这就是你确定它所在的架子的方式。那么......你想要返回的是什么?喜欢。 “我想知道我可以在哪个架子上找到每件物品”你没有提到那部分。
-
MySQL 有外连接。它没有 FULL OUTER JOIN。
标签: mysql outer-join