我想选择列符合条件的所有行,但也要选择与条件不匹配的所有行,但要与符合条件的行有关系。
给出这样的表结构:
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
我认为自我加入是要走的路,但我无法弄明白。
答案 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
行获得一行,以便最终结果不包含任何重复项。