我的方案如下:
我有两个表:table1
,table2
table1
有一个字段:字符串类型的table1-name
。
table2
有一个字段:字符串类型的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
的子字符串。
您可以更正我的查询吗?
答案 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)