2012-02-27 14 views
5

Come posso, in mysql, controllare se un valore si trova all'interno di un certo numero di campi in un'altra tabella?MySQL - NOT IN LIKE

Qualcosa di simile

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

Ma io non credo che sia giusto, vero?

risposta

2

La seguente query dovrebbe farlo.

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

Questo sarebbe più veloce o meglio in qualche modo? –

+0

Sì, se il campo e il valore sono indicizzati sarà molto più veloce –

+0

Ho confrontato i due, questo è 4 volte più veloce del primo. –

2

No, non proprio.

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

probabilmente lo faranno. Supponendo che value sia una colonna su table e field sia la colonna corrispondente su anothertable che può contenere o meno value come sottostringa.

Attenzione, tuttavia, questa sarà una query molto lenta, se anothertable contiene molte righe. Non penso che ci sia un indice che possa aiutarti. MySQL dovrà eseguire una scansione tabella comparativa stringhe di anothertable per ogni riga in table.

+0

ho pensato che sarebbe stato lento , ma sto solo eseguendo una query di manutenzione una tantum. –

+0

Btw, ho appena aggiornato per un errore di battitura - ho avuto 'NON MI PIACE' al posto di 'LIKE' nella sotto-query. –

+0

Sì, ho preso quell'errore. –

0

Se ho capito bene la tua domanda (supponendo che si desidera trovare il valore dalla tabella in 2 campi (campo1 e campo2) in "anothertable"):

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