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倍左右。