sql >> Base de Datos >  >> RDS >> Mysql

Seleccione todo donde el campo contenga cadenas separadas por comas

Con MySQL, puede usar FIND_IN_SET() :

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;

http://dev.mysql .com/doc/refman/5.0/en/string-functions.html#function_find-in-set

Tenga en cuenta que FIND_IN_SET espera que las cadenas sean coma separados, no coma y espacio apartado. Así que podrías tener problemas con la última etiqueta. La mejor manera sería normalizar la tabla; de lo contrario, podría borrar los espacios de las tags columna; finalmente, puede solucionar el problema agregando un espacio a las tags columna:

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;

Si el número de etiquetas es limitado, podría considerar convertir la columna en un SET . Esto mejorará en gran medida la eficiencia.

ACTUALIZAR

Excepto que tengo los espacios mal . Están antes las cuerdas y no después.

Entonces:

SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;

Pero de nuevo, deshazte de esos espacios, no son más que problemas :-)

ACTUALIZACIÓN 2

Lo anterior funciona, está bien. Pero, eso es casi todo lo que puedes decir a mi favor. No solo la solución es bastante *in*eficiente, sino que también hace que el sistema sea casi inmantenible (estuve allí, hice eso, obtuve la camiseta y un trasero masticado debajo del mismo). Así que ahora insistiré un poco a favor de la normalización, es decir, tener al menos estas dos tablas más:

CREATE TABLE tags ( id      INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
                    tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );

¿Cuánto es esto mejor? Déjame contar las formas.

  • puede agregar fácilmente consultas más flexibles ("tiene todas las etiquetas en iOS, C++, ..." o "tiene al menos tres etiquetas entre estas:( iOS, Python, SQL, .NET, Haskell )". Sí, puedes hacer esto con FIND_IN_SET , pero confía en mí, no lo disfrutarás .
  • tienes un diccionario controlado de etiquetas, lo que le permite verificar si se conoce alguna etiqueta (además de generar fácilmente listas como cuadros combinados desplegables o, ¿alguien dijo 'jQuery Autocompletar'?).
  • guarda algo de espacio en el disco (las etiquetas se escriben una vez)
  • las búsquedas son rápidas . Si ya conoce las etiquetas que está buscando y las compila previamente en identificadores de etiquetas, dejarán marcas de quemaduras de goma de SQL en el pavimento cuando se ejecuten (búsqueda indexada de un entero ¡valor!). Y las etiquetas que no compilarán no estarán allí , y lo sabrá incluso antes de que comience la búsqueda.
  • hace mucho más fácil cambiar el nombre de las etiquetas
  • puede contener cualquier número de etiquetas (corre el riesgo de tener alguna etiqueta truncada a 'Desarrollo de iOS' tarde o temprano...)

Creo que el "campo CSV" está censurado (o) entre los Antipatrones SQL ( http://pragprog.com/book/bksqla/sql-antipatterns ), y por una buena razón.