Dada una tabla con los siguientes campos:
Código:
Y con los siguientes datos:id -> bigint rel_id -> bigint key -> varchar(255) value -> longtext
Código:
Necesito una query que devuelva el campo REL_ID para todas las filas que contengan "valores" en el campo KEY, y que contengan uno o más valores específicos (pongamos, por ejemplo, 2 y 8) en el campo VALUE.ID REL_ID KEY VALUE 1 1 nombre pepe 2 1 apellido perez 3 1 valores 2,4,7 4 2 nombre luis 5 2 apellido gomez 6 2 valores 5,7,12 7 3 nombre carlos 8 3 apellido diaz 9 3 valores 3,4,8 10 4 nombre carlos 11 4 apellido diaz 12 4 valores 2,5,8
Se me ocurren tres posibles soluciones. La primera:
Código:
La segunda implica guardar el contenido del campo VALUE con una coma más al principio y otra al final (ej. ",2,5,8," en lugar de "2,5,8"), y es:SELECT rel_id FROM tabla WHERE key = 'valores' AND FIND_IN_SET(2,value) AND FIND_IN_SET(8,value)
Código:
La tercera se basa en la segunda e implica ordenar los valores de forma creciente, además de guardar el contenido del campo VALUE con dos comas de separación en lugar de una (ej. ",,2,,5,,8,," en lugar de ",2,5,8,"), y es:SELECT rel_id FROM tabla WHERE key = 'valores' AND value LIKE "%,2,%" AND value LIKE "%,8,%"
Código:
Las tres funcionan; mi duda tiene que ver con la performance. La implementación real será en un sitio de alto tráfico, va a tener unos cuantos valores más en el campo VALUE y va a ser necesario filtrar por más de dos de ellos (podrán ser unos cinco o seis), y considerando que esta funcionalidad es el corazón del proyecto en cuestión, necesito que el query sea lo más rápido y eficiente posible. Valga mencionar que modificar la estructura de las tablas no es, lamentablemente, una opción viable.SELECT rel_id FROM tabla WHERE key = 'valores' AND value LIKE "%,2,%,8,%"
Lo que sí es una opción válida es utilizar, en el campo VALUE, palabras en vez de números (esos números se corresponden con IDs en otra tabla), cosa de aplicar el FIND_IN_SET o el LIKE directamente sobre ellas.
Obviamente, si se les ocurren soluciones mejores, soy todo oídos. Les agradezco de antemano cualquier información que me puedan brindar.