2010-10-27 19 views
27

Ok, di solito so che avrebbe fatto qualcosa di simile è si sapeva i valori di matrice:MySQL - Come selezionare le righe in cui il valore è nella matrice?

SELECT * WHERE id IN (1,2,3) 

Ma ... non so il valore di matrice, so solo il valore che voglio trovare in una matrice "memorizzata":

SELECT * WHERE 3 IN (ids) // Where ids is stored as 1,2,3 

Quale non funziona. c'è un altro modo per fare ciò?

+0

In quale linguaggio di programmazione che si sta scrivendo la query? – VoteyDisciple

+0

è 'ids' un VARCHAR? –

+0

Sto usando PHP e MySQL. – Tomas

risposta

48

Utilizzare la FIND_IN_SET function:

SELECT t.* 
    FROM YOUR_TABLE t 
WHERE FIND_IN_SET(3, t.ids) > 0 
+0

Lei signore, sono una stella. Ho cercato in alto e in basso per esso e sapevo che doveva essere lì. Il mio istinto mi ha detto che avrebbero dovuto usare CONTAINS per questo, ma cosa ne so. – Tomas

+3

@Tomas: solo MySQL ha questa funzione - qualsiasi altro database, dovresti creare qualcosa da te. –

+0

Non ho intenzione di cambiare ...ma questo è sicuramente buono a sapersi. – Tomas

15

Nel momento in cui la query arriva a SQL è necessario aver già espanso l'elenco. Il modo semplice per farlo, se usi ID da una fonte dati interna affidabile, in cui puoi essere sicuro al 100% di essere interi (ad esempio, se li hai selezionati dal tuo database in precedenza) è questo:

$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')'; 

Se i dati sono in arrivo da parte dell'utente, però, è necessario assicurarsi che stai ricevendo solo i valori interi, forse più facilmente in questo modo:

$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')'; 
+0

+1 per array_map ('intval', ...). Si potrebbe anche usare mysql_real_escape_string() invece di intval(), che lascerebbe la convalida dell'intero a MySQL, ma richiederebbe una logica aggiuntiva per citare gli elementi dell'array. –

+0

Grazie, ma come ho detto, conosco l'id e non ho bisogno di cercare le righe in base a un set conosciuto. L'altro modo come risposta di seguito. – Tomas

+0

credo che il secondo esempio dovrebbe essere: $ sql = 'SELECT * WHERE id IN ('. Implode (',', array_map ('intval', $ ids)). ')'; –

4

Se si utilizza la funzione FIND_IN_SET:

FIND_IN_SET(a, columnname) cede tutti i record che hanno "a" in loro, da soli o insieme ad altri

E

FIND_IN_SET(columnname, a) rendimenti solo i record che hanno "un" in loro da solo, non quelli con gli altri

Quindi, se RECORD1 è (a, b, c) ed RECORD2 è (a)

FIND_IN_SET(columnname, a) rendimenti solo record2 mentre FIND_IN_SET(a, columnname) produce entrambi i record.

3

Se l'elemento di matrice non è numero intero si può usare qualcosa come di seguito:

$skus = array('LDRES10','LDRES12','LDRES11'); //sample data 

if(!empty($skus)){  
    $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') "  
} 
+0

È possibile aggiungere alla query il valore ** LIMIT ** con il suo offset? – Shiplu

Problemi correlati