Sql con lista

A ver si me puedes ayudar ya que en otros sistema de bd funciona pero en mysql se ve que no.

La consulta seria :

select * from galería where idg in (select ids from noticias where idn=70)

IDG es INTEGER

IDS es MEMO

La subconsulta devuelve un solo campo con un solo registro : 1,2,5

La consulta principal debería devolver 3 registros de galería donde idg tenga, el 1 el 2 y el 5

Si en mysql pongo : select * from galería where idg in (1,2,5), si funciona correctamente, pero si obtengo 1,2,5 de una columna como ids, solo me devuelve el 1

¿Cómo se puede hacer esto?, es algo fácil y no funciona.

1 Respuesta

Respuesta
1

Estimado virmix:

La solución que intentaste es ingeniosa, y sería lógico que funcionase, pero, como vemos, en MySQL no funciona. Esto es debido a IN sirve para buscar en los distintos registros que resultan de una subconsulta, pero no si el resultado es una cadena separada por comas.

Pero hay otra forma que funcionará.

Por la forma en que razonaste la solución parecerías programador de Visual Fox Pro.

Bien, en Visual Fox Pro tenemos la función INLIST(), que puede recibir cualquier cantidad de argumentos. Ej: INLIST(a, b, c, d, e, f, g) y devolverá true si el primero (a) es igual a cualquiera de los siguientes. Sirve para saber si "está en la lista".

Si los argumentos, como hiciste, quieres que vengan en una cadena separados por comas, y que sean dinámicamente leídos de una tabla, te servirá la función de MySQL FIND_IN_SET. Esta función retorna la posición del elemento de una lista, que coincide con el primer argumento dado, o devuelve cero si no hay coincidencia.

Con las tablas de tu ejemplo funcionaría esto:

select * from galería where FIND_IN_SET(idg, (select ids from noticias where idn=70))>0;

Se verifica el resultado de FIND_IN_SET, que debería ser mayor que 0 para indicar presencia en la lista. A su vez, si bien la forma más simple sería FIND_IN_SET("1", "3,6,4,1,8"), aquí lo combinamos con el resultado de una subconsulta para que la lista (el segundo argumento) varíe según el caso.

Espero haberte comprendido y ayudado, en caso contrario vuelve a preguntar para que lo intentemos nuevamente.

Hola, estupendo es lo que estaba buscando y no encontraba solo necesita un pequeño ajuste más.

Si la lista es 5,1,2 como resultado de la subconsulta me gustaría que MySql lo lista en ese mismo orden y no lo ordenara de menor a mayor.

He probado varias opciones sin éxito ay que me lo ordena de cualquiera de las formas. Hay alguna opción que incluir en order by o sin el para indicar que lo muestre tal y como lo obtiene.

Saludos

MySQL te presenta los datos en el orden en que los encuentra en la tabla galería, por eso el orden no es como los especificas en la lista leída de noticias.

Aunque parezca mentira, para que use el orden de la lista, agrega en ORDER BY:

[color=#000088]SELECT [/color]* [color=#000088]FROM [/color]galería
[color=#000088]WHERE [/color]FIND_IN_SET(idg, (select ids from noticias))>0
ORDER BY FIND_IN_SET(idg, (select ids from noticias));

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas