如果我需要从表A中获取表B中带有匹配标记的行,我将只做一个简单的JOIN ON / WHERE B.name = X.但MySQL只返回A中的行和来自B的匹配标记。
如果我想要检索表A中匹配的所有表,并且同时从表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
感谢我能得到的任何帮助。谢谢!
答案 0 :(得分: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就是这种情况。
答案 1 :(得分: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)
我认为它不会比这更好,基本上你不需要再查询表格了;你从b中搜索匹配'foo'的所有行,然后加入那些包含所有相关项目的行。