我是 内部加入 和 左加入 的新手,希望有人可以帮助我。
我有3张桌子..
衬衫:
SID |名称
------------
01 |样品1 02 |样品2
颜色
sid |色| COLOR_ID
------------
01 |红色| 900个
02 |绿色| 090
价格:
sid |价格
------------
01 | 100
02 | 100
我的查询是:
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'
我想要达到的目标是:
sid |名字|颜色|价格
----------------------
02 | Sample2 |绿色| 100
我得到的是:
sid |名字|颜色|价格
----------------------
null | null | null | null
我知道我的查询肯定有问题。所以有人可以告诉我对此有什么正确的查询吗?
答案 0 :(得分:1)
我认为你必须使用:
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'
Prices
。GENDB_ID
不是有效字段,也不是您必须使用的字段(我想)。
答案 1 :(得分:1)
尝试以下方法。这部分
`on `Shirts`.`sid` = `Prices`.`GENDB_ID
看起来不正确。请尝试改为:
on `Shirts`.`sid` = `Prices`.`sid`
答案 2 :(得分:1)
试试这个: -
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid` AND `Prices`.`price`= 100 //Change this part.
WHERE `Shirts`.`sid`='02'
答案 3 :(得分:1)
SELECT
`Shirts`.*,
`Colors`.`color`,
`Prices`.`price`
FROM
`Shirts` INNER JOIN `Colors` on `Shirts`.`sid` = `Colors`.`sid`
JOIN `Prices` on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'
答案 4 :(得分:0)
这应该有效:
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Shirts`.`sid`='02'
您获得全部空行的原因是您在联接中包含的GENDB_ID
。
INNER JOIN
和LEFT JOIN
之间的区别在于INNER JOIN
将排除两个表之间的任何连接组合,这些组合不会导致匹配,LEFT JOIN
将强制即使没有匹配也会排成一行。
一个例子:
<强>衬衫强>
sid | name
------------
01 | Sample1
02 | Sample2
<强>颜色强>
sid | color | color_id
------------
01 | red | 900
03 | green | 090
INNER JOIN
SELECT * FROM Shirts INNER JOIN Colors ON Shirts.sid = Colors.sid
sid | name | color | color_id
---------------------------------
01 | Sample1 | red | 900
LEFT JOIN
SELECT * FROM Shirts LEFT JOIN Colors ON Shirts.sid = Colors.sid
sid | name | color | color_id
---------------------------------
01 | Sample1 | red | 900
02 | Sample2 | null | null
因此,在您的示例中,您强制使用LEFT JOIN
的行匹配不存在的条件GENDB_ID
,这会导致行中的所有列只有空值。
This previous post也可以提供帮助。
希望这有帮助!
答案 5 :(得分:0)
因为你是内部加入和离开加入的新手,我会让你快速回顾。
首先,将您的查询更改为这样(您参与ON过滤器的字段出错了)
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid` //Change this.
WHERE `Shirts`.`sid`='02'
除此之外,当您使用left join
时,您放入where
条件的列(左侧或右侧列中的列)确实很重要。
要获得正确和预期的结果,如果必须按RIGHT表(在您的Prices
表中)中的列过滤查询,那么该条件放在ON
过滤器中,而不是{{1过滤。
示例:
WHERE
修正:
SELECT `Shirts`.*, `Colors`.`color`, `Prices`.`price` FROM `Shirts`
INNER JOIN `Colors`
on `Shirts`.`sid` = `Colors`.`sid`
LEFT JOIN `Prices`
on `Shirts`.`sid` = `Prices`.`sid`
WHERE `Prices`.`price`= 100 //This can be wrong