Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询选择符合条件的行以及与匹配行相关的行_Mysql - Fatal编程技术网

MySQL查询选择符合条件的行以及与匹配行相关的行

MySQL查询选择符合条件的行以及与匹配行相关的行,mysql,Mysql,我想选择列与条件匹配的所有行,但也要选择与条件不匹配但与条件匹配的行有关系的所有行 给定如下表结构: group_id | word ---------+------ 1 | the 2 | cat 2 | sat 3 | on 1 | the 3 | mat 给定条件中的单词“%at%”,我希望获得匹配的行 2 | cat 2 | sat 3 |

我想选择列与条件匹配的所有行,但也要选择与条件不匹配但与条件匹配的行有关系的所有行

给定如下表结构:

group_id | word
---------+------
       1 |  the
       2 |  cat
       2 |  sat
       3 |   on
       1 |  the
       3 |  mat
给定条件
中的单词“%at%”
,我希望获得匹配的行

       2 |  cat
       2 |  sat
       3 |  mat
但是我还想得到相关的行。也就是说,组id等于与条件匹配的任何行的组id的行,在本例中为组id 2或3。最终结果应该是:

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

我认为自联接是一种可行的方法,但我不能完全理解。

有一种方法在中使用了

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

如果您尝试使用
join
执行相同的操作,您可能会得到重复的结果。

我想我已经找到了使用自连接的方法

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

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

您可以连接到一个派生表,该表返回所有选定的
组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\u id
获得一行,这样最终结果就不会包含任何重复项。

与往常一样,有很多方法可以使用MySQL为猫换肤。我如何判断不同的解决方案?我已经分析了所有三种解决方案,其中一种比其他解决方案快一点。在我的表上,大约有20000行,组id列上有一个索引,这个查询比我的答案或Gordon Linoff的答案要长30倍左右。