MySQL como múltiples valores

144

Tengo esta consulta MySQL.

Tengo campos de base de datos con este contenido

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

¿Por qué esta consulta similar no funciona? Necesito los campos con deportes o pub o ambos?

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

Respuestas:

133

La (a,b,c)lista solo funciona con in. Para like, tienes que usar or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
fuente
3
Esto no sería beneficioso en múltiples (digamos 5 o más consultas dinámicas de búsqueda), por lo tanto, sería mejor usar regexp.
Shayan Ahmad
315

Manera más rápida de hacer esto:

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

Es esto:

WHERE interests REGEXP 'sports|pub'

Encontré esta solución aquí: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Más sobre REGEXP aquí: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
fuente
si está pasando una cantidad desconocida de palabras clave como una cadena (a | b | c ...), la expresión regular es la única forma de hacerlo si quiere hacer LIKE, ¿verdad?
frecuente
1
¿Sabes si esto se puede hacer con una subconsulta? Digamos que tengo una columna de palabras que necesito buscar, ¿cómo puedo reemplazar 'sports | pub' con una subconsulta?
AdamMc331
Oye, ¿podrías decirme el REGEXP para LIKE en lugar de% LIKE%? Estoy tratando de buscar cadenas exactas ...
Deepanshu Goyal
3
Esta solución elimina la primera del agua
Donato
2
Para obtener el valor regexp de una columna:(select group_concat(myColumn separator '|') from..)
2015
34

¿Por qué no pruebas REGEXP? Pruébalo así:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
fuente
55
¡¡Si!! Lo quiero al revés. Así es SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pathros
3
¿En qué se diferencia esta respuesta de la jazkatrespuesta presentada 5 años antes que la suya?
Vaidas
@Vaidas - gracias - me hacía la misma pregunta ...: D
theFriedC
18

También puedes usarlo RLIKEtambién.

Por ejemplo:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
fuente
66
Solo tenga en cuenta para todos que RLIKE y REGEXP son sinónimos
Intacto
8

Su consulta debe ser SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Lo que entiendo es que almacena los intereses en un campo de su tabla, lo cual es un error. Definitivamente debe tener una tabla de "intereses".

Alexis Dufrenoy
fuente
2
Creo que debería serlo SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), pero es probable que esta técnica supere a la expresión regular en la mayoría de las situaciones.
Chris Strickland
7

No olvide usar paréntesis si usa esta función después de un ANDparámetro

Me gusta esto:

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

Como propuso @Alexis Dufrenoy, la consulta podría ser:

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

Más información en el manual .

Franc Drobnič
fuente
1

Más ejemplos de trabajo:

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";

La tarea consistía en contar los participantes en un evento (s) con filtro si la extensión de correo electrónico era igual a varios dominios de la compañía.

Intacto
fuente