将多列匹配到多行子查询?

时间:2012-05-31 12:35:27

标签: mysql subquery

我仍然在学习mySQL(我仍然对基本查询,计数,排序等感到满意)。很可能之前已经问过这个问题,但要么我不知道要搜索什么,要么我是一个新手来理解答案:

我有两张桌子:

tb1 (a,b,path)
tb2 (a,b,value)

我想创建一个查询,为tb1中的每一行返回“path”,其中a,b匹配tb2上的不同查询。在糟糕的mysql中,它会是这样的:

select
 path 
from tb1
 where
 a=(select a from tb2 where value < v1) 
and
 b=(select b from tb2 where value < v1); 

但是,这不起作用,因为子查询返回多个值。请注意,=之间的in交换不够好,因为对于select a,b from tb2 where value < v1

未返回的a,b值的组合也是如此

基本上,我已经在(a,b) - 空间中基于tb2确定了一个有趣的区域,并且想要研究该区域内tb1的行为(如果这使得它更清楚)。

谢谢你:)

3 个答案:

答案 0 :(得分:4)

这是ab上的for an INNER JOIN作业:

SELECT
  path
FROM 
   tb1
   INNER JOIN tb2 ON tb1.a = tb2.a AND tb1.b = tb2.b
/* add your condition to the WHERE clause */
WHERE tb2.value < v1

SELECT列表或WHERE子句中子查询的用例通常可以使用某种类型的JOIN来处理。连接通常比子查询更快,因为当使用SELECTWHERE子查询时,可能需要为返回的每行执行子查询,而不是只有一次。

除了上面链接的JOIN上的MySQL文档之外,我还建议Jeff Atwood's Visual Explanation of SQL JOINs

答案 1 :(得分:1)

INNER JOIN会做到这一点。

您只需要两个ON条件就可以匹配a和b值,如下所示:

SELECT path
FROM tb1
INNER JOIN tb2 ON tb1.a = tb2.a AND tb1.b = tb2.b
WHERE tb2.value < v1

答案 2 :(得分:0)

您可以这样限制结果集:

select
 path 
from tb1
 where
 a=(select a from tb2 where value < v1 LIMIT 1) 
and
 b=(select b from tb2 where value < v1 LIMIT 1);