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%')

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%'

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


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'

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'

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


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%')


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 .


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.