2013-06-07 11 views
9

muszę wykonać kwerendę wybierającą w następujący sposób:MySql wybrać w punkcie ciąg rozdzielany przecinkami

select * from my_table where id NOT IN (comma_delimited_string); 

Co to jest poprawny sposób to osiągnąć?

Biorąc pod uwagę fakt, że kontroluję kod klienta, który wysyła ciąg, czy istnieje lepsze podejście? (ciąg będzie zawierać około 30 identyfikatorów, więc staram się unikać wysyłania 30 parametrów, po jednym dla każdego identyfikatora).

Dziękuję wszystkim

+0

Co jest złego w wysyłaniu 30 paramów? Powinieneś być w stanie napisać jakiś kod, aby zbudować zapytanie, aby było łatwiej. –

+1

Czy kod klienta tworzy ciąg znaków lub czy tworzy zapytanie i wysyła zapytanie? –

+0

@GordonLinoff buduje ciąg znaków i wysyła go do procedury składowanej. –

Odpowiedz

16

Można użyć MySQL FIND_IN_SET funkcję:

SELECT * 
FROM my_table 
WHERE FIND_IN_SET(id, comma_delimited_string) = 0 

Uzupełnienie: Zauważ, że kwerenda powyżej nie podlegających optymalizacji, więc jeśli masz indeks na id MySQL go nie użyje. Musisz zdecydować, czy względna prostota używania FIND_IN_SET jest warta podjęcia potencjalnego trafienia wydajności (mówię potencjalny, ponieważ nie wiem, czy indeks jest id, czy też twój stół jest wystarczająco duży, aby to wzbudziło niepokój).

+1

Nie sądzę, że 'FIND_IN_SET' może używać indeksów. –

+1

Zdecydowanie nie, i dobry punkt. Zaktualizuję odpowiedź, aby ostrzec OP, że zapytanie nie będzie optymalizowane. Od nich zależy, czy to jest problem. –

+0

@EdGibbs identyfikator jest indeksowany. Tabela składa się z ~ 3500 rekordów. –

Powiązane problemy