Query que se me cruza
Hola domestikos...
Pues eso, estoy programando una aplicacion conphp y sql y se me ha cruzado por el camido una query que no consigo. Os comento:
Tengo una tabla con dos campos, paquete y producto. Se llama paquete_producto.
Los datos serian:
paquete - producto
10-1
10-3
10-5
20-1
20-3
30-5
Si quiero conseguir los productos del paquete 10 hago la siguiente query:
<fieldset>select producto from paquete_producto where paquete=10;</fieldset>
Pero cual seria la query si quiero conseguir el paquete que tiene los productos 1 y 3 nada más? en este caso me tendria que dar 20 pero no el 10 como por ejemplo con la siguiente:
<code>select paquete from paquete_producto where producto IN(1,3) group by paquete; </code>
Intente tambien haciendo esta otra query pero me da error con la variable n:
<code>select paquete,count(*) as n from paquete_producto where producto IN(1,3) group by paquete having n = 2; </code>
muchas gracias
iboff
Esta funcionaría:
<code>select paquete from paquete_producto where producto IN(1,3) group by paquete having count(*) = 2;</code>
lo único que tambien me daria en 20...
También lo conseguí haciendo dos llamadas, pero queria ver si con joins u otra cosa podría solucionarlo...
cachis.
zigotica
es que segun los datos deberia devolverte el 10 Y el 20, no entiendo tu ultimo mensaje ni en el primero cuando dices: <fieldset>Pero cual seria la query si quiero conseguir el paquete que tiene los productos 1 y 3 nada más? en este caso me tendria que dar 20 pero no el 10</fieldset>
iboff
Quiero encontrar la query que me de el paquete que tiene solo los productos 1 y 3. en este caso el 20.
Con las querys que he hecho me devolveria tambien el 10 ya que tiene el 1 y el 3, pero además tendría el 5, por lo que no me serviria.
estoy un pelin espeso, no se si me explique al final...
gracias de todas formas.
zigotica
ah vale, ahora lo capto
dagi3d
por qué no te puede devolver el paquete 10 cuando también tiene los productos 1 y 3? es decir, qué es que lo que tiene que haber para que te devuelva uno u otro?
iboff
Ya, si la última query que hcie me devuelve el id del paquete que tenga los productos 1 y 3, por lo que me devuelve el 10 y el 20.
Por eso mi pregunta era como hacer para que me devuelva el id del paquete que tenga solo los productos 1 y 3.
gracias
zigotica
dagi3d, a mi me ha pasado igual que a ti, he leido rapido, voy a poner el enfasis que le falta a la frase:
<fieldset>devuelva el id del paquete que tenga solo los productos 1 y 3</fieldset>
dagi3d
prueba esto:
<code>
SELECT
paquete,
GROUP_CONCAT(producto SEPARATOR ',') AS lista
FROM
paquete_producto
GROUP BY paquete
HAVING lista='1,3';
</code>
mirando la documentación vi que había una función que hacía lo que se me había ocurrido para solucionarlo, que era mostrar los resultados en una sola columna en lugar de hacerlo por filas y es la función group_concat. lo único que no sé a partir de qué versión de mysql existe esta función(lo probé en la 5 y funciona)
iboff
Lo malo es que lo tengo que hacer en sql, he visto concat_all, voy a ver como funciona y si sirve...
muchas gracias
dagi3d
en caso de que funcionase, me acabo de dar de cuenta de que habría que ordenar los resultados por el número de paquete ya que también podría devolver un '3,1' y seguiría siendo válido
iboff
<code>select paquete
from
paquete_producto,
(select paquete as paquete_filtrado from paquete_producto group by paquete having
count(*) = 2) tabla_filtrada
where
paquete_producto.paquete=tabla_filtrada.paquete_filtrado and
(paquete_producto.producto=1 or paquete_producto.producto=3)
group by
paquete_producto.paquete having count(*) = 2</code>
gracias Albert