我仍然在学习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) - 空间中基于tb2确定了一个有趣的区域,并且想要研究该区域内tb1的行为(如果这使得它更清楚)。
谢谢你:)答案 0 :(得分:4)
这是a
和b
上的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
来处理。连接通常比子查询更快,因为当使用SELECT
或WHERE
子查询时,可能需要为返回的每行执行子查询,而不是只有一次。
除了上面链接的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);