我是这个问题的答案完全清楚: https://stackoverflow.com/a/4796911/2307520 但是这是一个有点不同的问题!双FULL OUTER JOIN在MySQL
是的,我明白他们是如何模拟简单的FULL OUTER使用UNION在MySQL 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);
项可以是在一个盒子里,独立于一个货架,或者都没有(未定义)。盒子可以放在架子上或没有定义。
理想情况下,我会使用SQL查询是这样的:(如果我有FULL OUTER在MySQL 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 ...
这将列出特定标准(所有条目看到在货架的盒子是,如果任何和所有项目,或其他任何东西)
我看不出架子和箱子之间连接的原因......为什么? – markg
,因为在放入物品之前,空的盒子可以放在架子里。 – David162795
所以一个物品可能放在一个盒子里,或者它可能只放在架子上。如果它在一个盒子里,那么这就是你如何确定它所在的架子。那么...你想要返回什么?喜欢。 “我想知道哪个货架我可以找到每件物品”,你没有提到这一部分。 – JNevill