2016-11-05 18 views
2

列が条件に一致するすべての行を選択したいが、基準に一致しない行をすべて選択する条件に一致する行一致する行に関連する条件と行に一致する行を選択するMySQLクエリ

このようなテーブル構造を考える:基準WHERE word LIKE '%at%'考える

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

を、私は一致する行

 2 | cat 
     2 | sat 
     3 | mat 

を取得したいと思いますが、私はまた、関連する行を取得したいです。すなわち、この場合には2または3をGROUP_IDされるであろう最終結果がなければならない、条件に一致する任意の行のGROUP_IDに等しいGROUP_IDを有する行である:

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

I参加自己方法であると思います私はそれを理解することができません。

+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

私は3つのソリューションのすべてをプロファイリングしましたが、これは他のソリューションよりも早く分かります。 – 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値選択返す派生テーブルに参加することができます:あなたはあなたがするように、group_idごとに1つの行を取得することを確認するように、サブクエリでDISTINCTを使用する必要が

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 

を最終結果に重複は含まれません。

+0

約20,000行のテーブルとgroup_id列のインデックスでは、このクエリは、私の答えまたはGordon Linoffの回答より約30倍長くかかります。 – Dom

関連する問題