三行加入mysql两次成功第三次没有

问题描述:

我有三张桌子人物,物品和地点。人们只能有1件物品。地点与2个表中的任何一个没有关系。我想让我记录加入所有3.我迄今做了2个人+项目,但是第3个我一直收到MySQL错误。没有加入位置。任何帮助?感谢三行加入mysql两次成功第三次没有

SELECT * FROM ITEMS i 
RIGHT JOIN PEOPLE p 
ON (p.ITEM_ID =i.ID) where 
p.ID=3 

RIGHT JOIN 

SELECT * FROM LOCATIONS lo where lo.ID=7 
+5

如果位置是与其他表格无关,你为什么试图将它加入他们? – 2013-05-08 21:32:51

+0

你能提供样本输入数据和结果吗? – 2013-05-08 21:39:34

+0

人员或项目需要对Locations.ID的引用。否则,这种情况意味着什么:) – rivarolle 2013-05-08 21:40:06

如果在没有公共join键,那么你可能需要做一个cross join。这产生了笛卡尔乘积,也就是从People/items选择用于每一行的每个位置:

SELECT * 
FROM ITEMS i RIGHT JOIN 
    PEOPLE p 
    ON (p.ITEM_ID =i.ID) cross join 
    location l 
WHERE p.ID=3 

顺便提一下,MySQL有一个非常灵活的(和非标准)join语法。您实际上可以将on子句从join中删除,并且其行为与cross join的行为相同。当然,这是一个坏习惯。如果您想要交叉连接,请明确使用cross join

+0

是的!很棒!我喜欢堆栈溢出!谢谢! – 2013-05-09 04:27:16

尝试是这样的:

SELECT peo.id, it.id, loc.id 
FROM People as peo 
INNER JOIN Items as it on it.id = peo.id 
INNER JOIN Locations as loc on loc.id = peo.id 
WHERE peo.ID=3 

编辑: 你的问题是编辑,而我打字,所以我的例子不匹配像以前那样。根据需要使用ITEM_ID和ID。

虽然不推荐,您还可以使用

SELECT * 
FROM People as peo 
INNER JOIN Items as it on it.id = peo.id 
INNER JOIN Locations as loc on loc.id = peo.id 
WHERE peo.ID=3 

我假设你想要的7 ID出现在每一行的位置......

SELECT * 
    ,(SELECT loc.name FROM Location loc WHERE loc.ID = 7) AS Location 
FROM ITEMS i 
RIGHT JOIN PEOPLE p 
ON (p.ITEM_ID =i.ID) 
WHERE p.ID=3 

OR

SELECT * 
FROM ITEMS i 
RIGHT JOIN PEOPLE p 
ON (p.ITEM_ID =i.ID) 
CROSS JOIN (SELECT * FROM LOCATIONS lo where lo.ID=7) l 
WHERE p.ID=3 

OR

[several other ways to go about it]