如何不喜欢MySQL中的很多项目?

时间:2016-03-10 07:48:10

标签: mysql sql

不喜欢很多物品并不绅士风度。但我需要使用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'可能包含数百条记录。

3 个答案:

答案 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)

首先我要说的是,不喜欢这么多事情确实非常不合情理。但有时你只需要......

无论如何..一种方法是将RLIKEGROUP_CONCAT结合使用,而不是LIKE。这会产生类似的结果。这可能会出错'#39;如果like_exclude表中有特殊的正则表达式字符。性能明智取决于你,并且表中有很多值你可能需要改变group_concat_max_len值:

SQLFiddle

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
相关问题