MySQL查询选择匹配条件的行和与匹配行相关的行

时间:2016-11-05 13:11:24

标签: 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,在这种情况下将是group_id 2或3.最终结果应为:

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

我认为自我加入是要走的路,但我无法弄明白。

3 个答案:

答案 0 :(得分: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 :(得分:1)

我想我已经想出了如何通过自我加入来做到这一点。

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

我不知道是否有更好(更有效)的方法来进行此查询。

答案 2 :(得分: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行获得一行,以便最终结果不包含任何重复项。