MySQL Come più valori


144

Ho questa domanda MySQL.

Ho campi di database con questo contenuto

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

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

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

Risposte:


133

L' (a,b,c)elenco funziona solo con in. Per like, devi usare or:

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

3
Questo non sarebbe utile in più (diciamo 5 o più query di ricerca dinamica), quindi sarebbe meglio usare regexp.
Shayan Ahmad,

315

Modo più veloce per farlo:

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

è questo:

WHERE interests REGEXP 'sports|pub'

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

Maggiori informazioni su REGEXP qui: http://www.tutorialspoint.com/mysql/mysql-regexps.htm


se si passa una quantità sconosciuta di parole chiave come stringa (a | b | c ...), la regexp è l'unica strada da percorrere se si vuole fare COME, vero?
frequente

1
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 subquery?
AdamMc331,

Ehi, potresti dirmi il REGEXP per LIKE invece di% LIKE%, sto cercando di ottenere stringhe esatte ...
Deepanshu Goyal

3
Questa soluzione spazza via il primo dall'acqua
Donato,

2
Per ottenere il valore regexp da una colonna:(select group_concat(myColumn separator '|') from..)
daVe,

34

Perché non provi REGEXP. Provalo in questo modo:

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

5
Si!! Lo voglio al contrario. Così è SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pathros il

3
In che modo questa risposta è diversa dalla jazkatrisposta inviata 5 anni prima della tua?
Vaidas,

@Vaidas - grazie - mi ponevo la stessa domanda ...: D
theFriedC

18

Puoi anche usare RLIKEanche.

Per esempio:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'

6
Nota per tutti che RLIKE e REGEXP sono sinonimi
Intacto

8

La tua domanda dovrebbe essere SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Quello che capisco è che memorizzi gli interessi in un campo del tuo tavolo, che è un'idea sbagliata. Dovresti avere definitivamente una tabella di "interesse".


2
Penso che dovrebbe essere SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), ma questa tecnica probabilmente supererà la regex nella maggior parte delle situazioni.
Chris Strickland,

7

Non dimenticare di usare la parentesi se si utilizza questa funzione dopo un ANDparametro

Come questo:

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


2

Come proposto da @Alexis Dufrenoy, la query potrebbe essere:

SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Maggiori informazioni nel manuale .


1

Altri esempi di lavoro:

SELECT COUNT(email) as count FROM table1 t1 
JOIN (
      SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
     ) t2 
ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";

L'attività consisteva nel contare i partecipanti a uno o più eventi con filtro se l'estensione della posta elettronica era uguale a più domini aziendali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.