我有简单的MySQL表格(这个问题简化了):
table A - id int, name varchar(255), id_b int
table B - id int, name varchar(255)
我在表A中有这些值:
1, 'a1', 10
2, 'a2', 11
3, 'a3', 12
我在表B中有这些值:
21, 'b1'
22, 'b2'
23, 'b3'
我有这个问题:
SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext FROM A WHERE name_ext = 'something';
我希望得到空的结果,但相反,我得到了表A中的所有3行,其值为name_ext
beeing NULL。这怎么可能 ?我该怎么做才能得到预期的结果?
提前感谢您的帮助。
答案 0 :(得分:1)
此查询的行为正确。它等同于以下内容:
SELECT A.name, B.name
FROM A
LEFT OUTER JOIN B ON B.id = A.id_b
WHERE A.name_ext = 'something'
如果没有匹配,则外连接返回B. *中的所有列为NULL。但是查询的结果对于A的每一行仍然有一行。
同样在你的版本中:
SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext
FROM A WHERE name_ext = 'something';
主查询为A的每一行返回一行,无论如何。 如果子查询在B中找到匹配项,则返回该匹配项。否则,如果找不到匹配项,查询仍会返回一行,并且B中没有匹配项会在第二列中显示为NULL。
如果您希望查询返回仅在B中匹配的行,请使用:
SELECT A.name, B.name
FROM A
INNER JOIN B ON B.id = A.id_b
WHERE A.name_ext = 'something'
答案 1 :(得分:0)
您的查询会收到一条错误消息。因为MySQL会理解你是按表A中的name_ext列过滤的。
无论如何,您可以使用内部联接查询来获得预期结果。
SELECT A.name as name, B.name as name_ext
FROM A INNER JOIN B on A.id_b = B.id
WHERE B.name = 'something';
希望这对你有用。