2

如果我需要从表 A 中获取具有表 B 中匹配标记的行,我只需执行一个简单的 JOIN ON/WHERE B.name=X。但是 MySQL 将只返回来自 A 的行和来自 B 的匹配标记。

如果我想从表 A 中检索所有在表 B 中具有匹配项的所有内容,同时从表 B 中检索所有链接到表 A 中的行的所有内容,我该怎么办。

A:
a.id
1
2
3

B: 
b.id   | b.a_id   | b.name
1      | 1        | foo
2      | 1        | bar
3      | 1        | derp
4      | 2        | foo
5      | 2        | derp
6      | 3        | bar

A search for "foo" should then return
a.id   | b.id     | b.a_id   | b.name
1      | 1        | 1        | foo
1      | 2        | 1        | bar
1      | 3        | 1        | derp
2      | 4        | 2        | foo
2      | 5        | 2        | derp

感谢我能得到的任何帮助。谢谢!

4

2 回答 2

0
 SELECT * FROM a JOIN b on b.a_id = a.id 
    WHERE EXISTS (SELECT 1 from b where a_id = a.id and b.name = 'foo')

在评论风暴之后,我意识到你想问什么。这应该是比 IN 子句更快的解决方案。

IN 子句有一些令人讨厌的问题,即必须为返回的每一行重新打开游标,因为 MySQL 必须检查其中的每个值。EXIST 子句可以重用游标,因为它只是检查它是否存在。请记住,在这种情况下实际需要运行的不同查询的数量等于 a 中值的数量。由于游标只是打开以测试是否存在而不是读取,因此除非查询不同,否则无需创建新游标。

我必须找到一些文档来支持 MySQL,但 Oracle 就是这种情况。

于 2012-09-23T01:14:20.343 回答
0
SELECT a.id, b.id, b.name FROM a 
RIGHT JOIN b ON (a.id = b.a_id) 
WHERE a.id IN (SELECT b.a_id FROM b WHERE b.name = 'foo')

我想这就是你要找的。可能不是最高效的解决方案,但我希望它能奏效。

编辑:

SELECT a_new.id, b.id, b.name FROM 
    (SELECT b.a_id FROM b WHERE b.name = 'foo') AS a_new
RIGHT JOIN b ON (a_new.id = b.a_id)

我不认为它会比这更好,基本上你不需要再查询表 a 了;您从 b 中获取与“foo”匹配的所有行,然后将这些行与所有相关项连接起来。

于 2012-09-23T01:21:43.713 回答