2010-04-08 6 views
201

Ho cercato di capire come posso fare una query con MySQL che controlla se il valore (stringa $haystack) in una determinata colonna contiene alcuni dati (stringa $needle), in questo modo:MySQL Query String contiene

mysql_query(" 
SELECT * 
FROM `table` 
WHERE `column`.contains('{$needle}') 
"); 

In PHP, la funzione viene chiamata substr($haystack, $needle), quindi forse:

WHERE substr(`column`, '{$needle}')=1 

risposta

291

Molto semplice realtà:

mysql_query(" 
SELECT * 
FROM `table` 
WHERE `column` LIKE '%{$needle}%' 
"); 

Il % è un carattere jolly per qualsiasi carattere. Si noti che questo può rallentare su dataset di grandi dimensioni, quindi se il database cresce, è necessario utilizzare gli indici fulltext.

+0

Questo funzionerà solo se si utilizza una query preparata. Se stai usando una stringa vera e propria (es. Script di aggiornamento di liquibase sql) allora considera INSTR menzionato sotto). Questo perché se la tua stringa contiene%, inizierai a far corrispondere le cose con. –

+2

conosco domande simili, eppure oggi volevo scoprire se esiste un certo valore nella stringa in qualche colonna che stavo cercando su google. Perché non ci avevo mai pensato prima ?? –

+0

è sensibile al maiuscolo/minuscolo? –

34
WHERE `column` LIKE '%$needle%' 
+0

durante la ricerca del carattere _ (trattino basso) la query LIKE '% _%' non funziona, per qualche motivo restituisce tutte le stringhe anche senza _ – Wojtek

103

Usa:

SELECT * 
    FROM `table` 
WHERE INSTR(`column`, '{$needle}') > 0 

Riferimento:

+0

sicuramente LIKE è più veloce di INSTR? – oedo

+10

@oedo: dipende. 'LIKE% ...%' non userà un indice se uno è presente, quindi dovrebbero essere equivalenti; 'LIKE ...%' userebbe un indice se presente. Se le prestazioni sono una preoccupazione reale, la ricerca di testo completo (FTS) sarebbe un approccio migliore. –

+0

perfetto. proprio quello che stavo cercando. – arik

8

Oltre alla risposta da @WoLpH.

Quando si utilizza la parola chiave LIKE, è anche possibile limitare la direzione di corrispondenza della stringa. Per esempio:

Se stavate cercando una stringa che inizia con il $needle:

... WHERE column LIKE '{$needle}%' 

Se stavate cercando una stringa che termina con la $needle:

... WHERE column LIKE '%{$needle}' 
19

miniera sta usando LOCATE in mysql:

LOCATE (substr, str), LOCATE (substr, str , pos)

Questa funzione è multi-byte sicura e fa distinzione tra maiuscole e minuscole solo se almeno un argomento è una stringa binaria.

Nel tuo caso:

mysql_query(" 
SELECT * FROM `table` 
WHERE LOCATE('{$needle}','column') > 0 
"); 
+5

'column' dovrebbe essere colonna (senza virgolette) – Wojtek

-1

Probabilmente alla ricerca di find_in_set funzione:

Where find_in_set($needle,'column') > 0 

Questa funzione agisce come in_array funzione in PHP

2

essere consapevoli che questo è pericoloso:

WHERE `column` LIKE '%{$needle}%' 

fare prima:

$needle = mysql_real_escape_string($needle); 

quindi sarà prevenire possibili attacchi.

+6

* Alcuni possibili attacchi. Inoltre, 'mysql_real_escape_string' sarà deprecato nelle future versioni di PHP. –

+0

buono a sapersi :-) –

+7

Dovresti usare [istruzioni preparate] (http://au1.php.net/pdo.prepared-statements) e lasciare l'escape a PHP. '$ stmt = $ dbh-> prepare (" Dove 'colonna' LIKE '{: needle}' "); $ stmt-> bindParam (': needle', $ needle); $ stmt-> execute(); ' – cloudworks