不喜欢很多物品并不绅士风度。但我需要使用exclude
使用许多项目列表not in
多项(not like
)的查询。
| source |
|========|
| danny |
| ram |
| nach |
| boom |
| trach |
| banana |
| key_exclude |
|================|
| danny |
| ram |
| like_exclude |
|================|
| bo |
| tr |
预期结果:
| result |
|========|
| banana |
| nach |
我想要这样的事情:
select * from source where key not in (select key from key_exclude.key)
and key not like in(like_exclude.key)
但它不起作用
我能做到:
select * from source where key not in (select key from key_exclude.key)
and key not like '%bo%' and key not like '%tr%'
唯一的问题是'like_exclue'可能包含数百条记录。
答案 0 :(得分:2)
以下是使用子查询的解决方案查询:
select *
from source AS s
where
s.`key` not in( select k.`key` from key_exclude AS k ) AND
NOT EXISTS( select 1 from like_exclude l WHERE s.`key` LIKE CONCAT('%', l.`key`, '%'));
下面是一个经过验证数据的完整演示,也是由OP http://sqlfiddle.com/#!9/22fe8a/1/0
放在SQLFiddle上的SQL:
-- Data
create table source(`key` char(20));
insert into source values
( 'danny' ),
( 'ram' ),
( 'nach' ),
( 'boom' ),
( 'trach' ),
( 'banana' );
create table key_exclude( `key` char(20));
insert into key_exclude values
( 'danny' ),
( 'ram' );
create table like_exclude( `key` char(20) );
insert into like_exclude values
( 'bo' ),
( 'tr' );
-- SQL Needed
select *
from source AS s
where
s.`key` not in( select k.`key` from key_exclude AS k ) AND
NOT EXISTS( select 1 from like_exclude l WHERE s.`key` LIKE CONCAT('%', l.`key`, '%'));
输出:
mysql> select *
-> from source AS s
-> where
-> s.`key` not in( select k.`key` from key_exclude AS k ) AND
-> NOT EXISTS( select 1 from like_exclude l WHERE s.`key` LIKE CONCAT('%', l.`key`, '%'));
+--------+
| key |
+--------+
| nach |
| banana |
+--------+
2 rows in set (0.00 sec)
实时示例 - SQL小提琴:http://sqlfiddle.com/#!9/22fe8a/1/0
答案 1 :(得分:2)
首先我要说的是,不喜欢这么多事情确实非常不合情理。但有时你只需要......
无论如何..一种方法是将RLIKE
与GROUP_CONCAT
结合使用,而不是LIKE
。这会产生类似的结果。这可能会出错'#39;如果like_exclude表中有特殊的正则表达式字符。性能明智取决于你,并且表中有很多值你可能需要改变group_concat_max_len
值:
SELECT
*
FROM
source as s
WHERE
s.key NOT IN (SELECT ke.key FROM key_exclude as ke)
AND
s.key NOT RLIKE (SELECT GROUP_CONCAT(le.key SEPARATOR '|') FROM like_exclude as le);
答案 2 :(得分:1)
您可以使用其他人来排除应答LIKE条件的结果
select * from source
where key not in (select key from key_exclude.key)
and key not in(select key from source
where key LIKE (select concat('%',key,'%') from like_exclude.key)
但是您的查询似乎有点奇怪,您无法从列中进行选择,因此我怀疑您必须更换
key_exclude.key -> key_exclude
另一张桌子
like_exclude.key -> like_exclude