如何检查表中的每个字段是否是另一个表中字段的nt子字符串

时间:2018-07-29 08:58:03

标签: mysql sql

我的方案如下: 我有两个表:table1table2 table1有一个字段:字符串类型的table1-nametable2有一个字段:字符串类型的table2-name

我想返回table1-name的所有行,这些行不是任何table2-name记录的子字符串。我做到了:

SELECT DISTINCT `table2-name`.`table2`
FROM `table2`, `table1`
WHERE `table2-name`.`table2` NOT IN (SELECT `table1-name` FROM `table1`)
LIMIT 100;

但这将返回所有不等于table2-name的{​​{1}}。我需要的是不是table1-name子字符串的所有table2-name

示例:

table2-name:aa.abc.com,bb.com,xyz.com

table1-name:abc.com,aaa.com,xyz.com

上面的查询将返回:

table2-name

我要返回的是:
abc.com aaa.com

我不希望返回aaa.com,因为它是abc.com的子字符串。

您可以更正我的查询吗?

3 个答案:

答案 0 :(得分:3)

在以下情况下使用NOT EXISTS

select *
from table1 t1
where not exists
(
  select *
  from table2 t2
  where t2.`table2-name` like concat('%', t1.`table1-name`, '%')
);

顺便说一句:应避免使用诸如table2-name之类的名称,并在其中使用引号来使用它们。改用table2_name之类的东西。

答案 1 :(得分:2)

如果Guidline不是很大,我想知道它会如何执行:

table2

或者,等效地:

select t1.*
from table1 t1 cross join
     (select group_concat(t2.name separator '|') as names
      from table2 t2
     ) t2
where t1.name not regexp t2.names;

这假设select t1.* from table1 t1 cross join (select group_concat(t2.name) as names from table2 t2 ) t2 where find_in_set(t1.name, t2.names) = 0; 没有特殊字符(对于t2.name)或逗号(对于regexp)。

答案 2 :(得分:1)

要检查某个东西是否是其他东西的子字符串,您需要使用“ LIKE”(如下所示)或可能的“ REGEXP_LIKE”。

SELECT DISTINCT table2.*
FROM table2
WHERE NOT EXISTS (SELECT 1 FROM table1 where table1.table1name LIKE CONCAT('%',table2.table2name,'%') > 0)
LIMIT 100;

在另一个音符上
1-您的问题描述不一致(反复混淆table1和table2),选择一个更好的名称可能会有所帮助。
2-如您所见,我可以随意重命名列以删除'-'字符。

另一个可以使用的版本:

SELECT DISTINCT table2.*
FROM table2
WHERE table2name NOT IN (SELECT table2.table2name FROM table1 where table1.table1name like CONCAT('%',table2.table2name,'%') > 0)
LIMIT 100;

请检查SQLFiddle (I also copied Thorsten Kettner's version above in there after renaming tables/columns)