2012-02-27 1 views
5

Как я могу в mysql проверить, находится ли значение внутри нескольких полей в другой таблице?MySQL - NOT IN LIKE

Что-то вроде

SELECT * FROM table WHERE concat('%',value,'%') NOT LIKE IN(SELECT field FROM anothertable) 

Но я не думаю, что это совершенно верно, это?

ответ

2

Следующий запрос должен это сделать.

SELECT DISTINCT t.* 
FROM table t, 
     anothertable a 
WHERE a.field NOT LIKE Concat('%', t.`value`, '%'); 
+0

Будет ли это быстрее или лучше? –

+0

Да, если поле и значение индексируются, это будет намного быстрее. –

+0

Я сравнил два, этот в 4 раза быстрее, чем первый. –

2

Нет, не совсем.

SELECT * FROM table WHERE NOT EXISTS (
    SELECT * from anothertable WHERE field LIKE CONCAT('%',value,'%') 
) 

, возможно, это сделает. Предполагая, что value является столбцом на table, а field является соответствующим столбцом на anothertable, который может содержать или не содержать value в качестве подстроки.

Будьте осторожны, хотя это будет очень медленный запрос, если anothertable содержит много строк. Я не думаю, что есть индекс, который может вам помочь. MySQL должен будет выполнить сканирование таблицы сравнения строк anothertable для каждой строки в table.

+0

Я полагал, что это будет медленно , но я просто выполняю одноразовый запрос на обслуживание. –

+0

Btw, я просто обновился для опечатки - у меня «НЕ НРАВИТСЯ» вместо «LIKE» в подзапросе. –

+0

Да, я поймал эту опечатку. –

0

Если я правильно понимаю ваш вопрос (если вы хотите найти значение из таблицы в 2-х полей (field1 и field2) в «anothertable»):

SELECT * 
FROM table t 
WHERE EXISTS (SELECT Count(*) FROM anothertable WHERE field1 LIKE concat('%',t,value,'%') OR field2 LIKE concat('%',t,value,'%')