2013-06-07 13 views
9

Ho bisogno di eseguire una query di selezione nel modo seguente:MySql SELECT nella stringa di clausola delimitato da virgole

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

Qual è il modo corretto per raggiungere questo obiettivo?

Considerando il fatto che sono in controllo del codice client che invia la stringa, esiste un approccio migliore? (la stringa conterrà circa 30 ID, quindi sto cercando di evitare di inviare 30 parametri, uno per ogni ID).

Grazie a tutti

+0

Cosa c'è di sbagliato nell'invio di 30 parametri? Dovresti essere in grado di scrivere del codice per creare la query per renderlo più semplice. –

+1

Il codice client sta creando la stringa o sta costruendo la query e inviando la query? –

+0

@GordonLinoff sta costruendo la stringa e inviandola a una stored procedure. –

risposta

16

È possibile utilizzare la funzione di MySQL FIND_IN_SET:

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

Addendum: Si noti che la query di cui sopra è non ottimizzabile, quindi se avete un indice su id MySQL non lo userà. Dovrai decidere se la semplicità relativa dell'uso di FIND_IN_SET vale la pena di prendere un potenziale colpo di performance (dico potenziale perché non so se id è indicizzato o se la tua tabella è abbastanza grande perché questa sia una preoccupazione).

+1

Non penso che "FIND_IN_SET' possa usare gli indici. –

+1

Decisamente no, e buon punto. Aggiornerò la risposta per avvertire l'OP che la query non sarà ottimizzabile. Spetterà a loro decidere se questo è un problema. –

+0

L'ID @EdGibbs è indicizzato. La tabella è composta da ~ 3500 record. –

Problemi correlati