2013-06-07 7 views
9

Ich brauche eine Auswahlabfrage in der folgenden Weise auszuführen:MySql wählen IN-Klausel Zeichenfolge kommagetrennte

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

Was ist der richtige Weg, dies zu erreichen?

Angesichts der Tatsache, dass ich die Kontrolle über den Client-Code, der die Zeichenfolge sendet, habe, gibt es einen besseren Ansatz? (Die Zeichenfolge enthält ungefähr 30 IDs, so dass ich versuche, 30 Parameter zu vermeiden, einen für jede ID).

Danke alle

+0

Was ist los mit dem Senden von 30 Parametern? Sie sollten in der Lage sein, etwas Code zu schreiben, um die Abfrage für Sie zu vereinfachen. –

+1

Erstellt der Clientcode die Zeichenfolge oder erstellt er die Abfrage und sendet die Abfrage? –

+0

@GordonLinoff baut die Zeichenfolge und sendet sie an eine Stored Procedure. –

Antwort

16

können Sie die FIND_IN_SET Funktion MySQL verwenden:

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

Nachtrag: Beachten Sie, dass die Abfrage oben ist nicht optimierbar, wenn Sie also einen Index auf id MySQL wird es nicht verwenden. Sie müssen entscheiden, ob die relative Einfachheit der Verwendung von FIND_IN_SET einen möglichen Leistungseinbruch wert ist (ich sage Potenzial, weil ich nicht weiß, ob id indexiert ist oder ob Ihre Tabelle groß genug ist, um dies zu berücksichtigen).

+1

Ich glaube nicht, 'FIND_IN_SET' kann Indizes verwenden. –

+1

Definitiv nicht, und guter Punkt. Ich werde die Antwort aktualisieren, um das OP zu warnen, dass die Abfrage nicht optimierbar sein wird. Es liegt an ihnen zu entscheiden, ob das ein Problem ist. –

+0

@EdGibbs ID ist indiziert. Die Tabelle besteht aus ~ 3500 Datensätzen. –