2010-11-13 6 views
99

Ho questa query MySQL.MySQL Come più valori

ho campi del database con questo contenuto

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games 

Perché questa domanda come non funziona? Ho bisogno dei campi con sport o pub o entrambi?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%') 

risposta

89

La lista (a,b,c) funziona solo con in. Per like, è necessario utilizzare or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%' 
6

Vostri criteri dovrebbe essere SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Quello che ho capito è che si memorizzano gli interessi in un campo della tabella, che è un equivoco. Dovresti avere definitivamente una tabella di "interesse". modo

+2

Penso che dovrebbe essere "SELECT * FROM table WHERE find_in_set (interest, 'sports, pub')', ma questa tecnica rischia di sovraperformare la regex nella maggior parte delle situazioni. –

+0

Hai ragione. Ho modificato la mia risposta. –

234

più veloce di fare questo:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%' 

è questo:

WHERE interests REGEXP 'sports|pub' 

trovato questa soluzione qui: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

più su REGEXP qui: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

+28

+1, anche se non più veloce in fase di esecuzione, ma più veloce nelle sequenze di tasti. – Johan

+0

se passi una quantità sconosciuta di parole chiave come una stringa (a | b | c ...), l'espressione regolare è l'unico modo per andare se vuoi fare LIKE, vero? – frequent

+0

Sai se questo può essere fatto con una subquery? Diciamo che ho una colonna di parole che devo cercare, come posso sostituire "sports | pub" con una sottoquery? – AdamMc331

3

Don 't dimenticare di usare le parentesi se si utilizza questa funzione dopo un AND parametro

Ti piace questa:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%') 
25

Perché non si tenta REGEXP. Prova in questo modo:

SELECT * FROM table WHERE interests REGEXP 'sports|pub' 
+1

questo è veramente bello. imparato qualcosa di nuovo. grazie ,, – amrodelas

+0

Questa dovrebbe essere la risposta accettata. – Mark

+0

Grazie Marco ma hanno già accettato un'altra risposta :) –

1

Come @Alexis Dufrenoy proposto, la query potrebbe essere SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Maggiori informazioni nel manual.