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.