检索tag-siblings时标记搜索

时间:2012-09-23 01:11:33

标签: jquery mysql sql database

如果我需要从表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

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

2 个答案:

答案 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'的所有行,然后加入那些包含所有相关项目的行。