繁体   English   中英

匹配多列到多行子查询?

[英]match multiple columns to multiple-row subquery?

我仍在学习有关mySQL的知识(实际上我仍然只能接受基本查询,计数,排序等)。 这个问题很可能已经被问过了,但是我不知道要搜索什么,或者我对于一个新手来说太了解了答案:

我有两个表:

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

我想对a,b与tb2上的不同查询匹配的tb1中的每一行返回“ path”的查询。 在糟糕的mysql中,它将类似于:

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

但是,这不起作用,因为子查询返回多个值。 请注意,通过in交换= by还不够好,因为对于a,b值的组合( select a,b from tb2 where value < v1未返回)是不select a,b from tb2 where value < v1

基本上,我已经基于tb2在(a,b)空间中确定了一个有趣的区域,并想研究tb1在该区域内的行为(如果可以更清楚地了解)。

谢谢 :)

这是一个工作一个INNER JOIN两个ab

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的SQL JOIN的可视化解释。

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

您可以通过以下方式限制结果集:

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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM