2012-02-27 22 views
5

Jak mogę w mysql sprawdzić, czy wartość znajduje się w wielu polach w innej tabeli?MySQL - NIE PODOBA JAKO

Coś

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

Ale nie sądzę, że jest całkiem w porządku, prawda?

Odpowiedz

2

Następujące zapytanie powinno to zrobić.

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

Czy byłoby to w jakiś sposób szybsze lub lepsze? –

+0

Tak, jeśli pole i wartość są indeksowane, będzie znacznie szybciej –

+0

Porównałem te dwa, ten jest 4 razy szybszy od pierwszego. –

2

Nie, niezupełnie.

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

prawdopodobnie to zrobi. Zakładając, że value jest kolumną o numerze table i field jest odpowiednią kolumną na anothertable, która może zawierać lub nie zawierać value jako podłańcuch.

Ostrzegam, jednak - będzie to bardzo powolne zapytanie, jeśli anothertable zawiera wiele wierszy. Nie sądzę, że istnieje indeks, który może ci pomóc. MySQL będzie musiał skanować tabelę porównującą łańcuch znaków o numerze anothertable dla każdego wiersza w table.

+0

Pomyślałem, że to będzie powolny , ale właśnie uruchamiam jednorazowe zapytanie konserwacyjne. –

+0

Btw, właśnie zaktualizowałem dla literówki - miałem "NIE LUBIĘ" zamiast "LIKE" w pod-zapytaniu. –

+0

Tak, złapałem tę literówkę. –

0

Jeśli dobrze rozumiem Twoje pytanie (zakładając chcesz znaleźć wartość z tabeli w 2 pola (pole field1 i pole2) w "anothertable"):

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