2016-11-05 125 views
2

我想選擇列匹配條件的所有行,但也選擇所有不符合條件但與符合條件的行。MySQL查詢選擇匹配與匹配行相關的條件和行的行

給定一個表的結構是這樣的:

group_id | word 
---------+------ 
     1 | the 
     2 | cat 
     2 | sat 
     3 | on 
     1 | the 
     3 | mat 

給出的標準WHERE word LIKE '%at%',我想爲匹配行

 2 | cat 
     2 | sat 
     3 | mat 

,但我也想要得到的相關行。也就是說,具有GROUP_ID等於匹配的標準,在這種情況下會被GROUP_ID 2或3任一行GROUP_ID行最終的結果應該是:

 2 | cat 
     2 | sat 
     3 | on 
     3 | mat 

我認爲自連接是這樣的去,但我不能弄明白。

+0

像往常一樣,有很多方法可以使用MySQL爲貓蒙皮。我如何判斷不同的解決方案? – Dom

回答

2

一種方法是使用in

select t.* 
from t 
where t.group_id in (select t2.group_id 
        from t t2 
        where t2.word LIKE '%at%' 
        ); 

如果你嘗試做使用join同樣的事情,你可能會得到重複的結果。

+1

我已經介紹了所有三種解決方案,這個解決方案比其他解決方案要快得多。 – Dom

1

我想我已經想出瞭如何使用自連接來完成它。

SELECT DISTINCT `t1`.* 
FROM `test` AS `t1` JOIN `test` AS `t2` 
ON `t1`.`group_id`=`t2`.`group_id` 
WHERE `t2`.`text` LIKE '%at%' 

我不知道是否有更好(更有效率)的方法來做這個查詢。

1

你可以加入到返回所有選擇group_id值派生表:

SELECT t1.* 
FROM mytable AS t1 
JOIN (SELECT DISTINCT group_id 
     FROM mytable 
     WHERE word LIKE '%at%' 
) AS t2 ON t1.group_id = t2.group_id 

你必須在子查詢中使用DISTINCT,這樣才能確保你得到一個行每group_id,使最終結果不包含任何重複。

+0

在我的表上有大約20,000行和group_id列上的索引,這個查詢比我的答案或Gordon Linoff的答案要長約30倍。 – Dom