2012-05-31 82 views
2

我仍然非常瞭解mySQL(對於基本查詢,計數,排序依然非常滿意)。這是非常有可能,這個問題已經被問過,但無論是我不知道該怎麼尋找,還是我太新手瞭解答案:匹配多列到多行子查詢?

我有兩個表:

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

我想爲tb1中的每一行返回「路徑」,其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的行爲(如果這使得它更清晰)。

謝謝:)

回答

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子句中子查詢的用例通常可以使用某種類型的來處理。由於當使用SELECTWHERE子查詢時,聯接通常會比子查詢更快,因此可能需要執行子查詢,每行返回,而不是僅返回一次。

超越上JOIN MySQL文檔上述經鏈接,我也建議Jeff Atwood's Visual Explanation of SQL JOINs

+0

非常好的鏈接:) – Kaare

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

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