Dúvida em Query MySQL
Possuo a seguinte tabela:
-[b]id[/b]: int PK auto_inc
-[b]id_ingrediente[/b]: int FK
-[b]id_alimento[/b]: int FK
Preciso fazer o seguinte:
pegar o id_alimento que possuir por exemplo o id_ingrediente 8,10 e 11.
Por exemplo:
[img]http://img99.imageshack.us/img99/4784/postle.png[/img]
Preciso que ao procurar por alimentos que possuam [b]SOMENTE[/b] os ingredientes de id 9,10 e 11 me retorne o id_alimento 15!
Será que ficou claro? alguém consegue pensar em alguma query possivel? Pois estava pensando em fazer na programação, mas ficaria muito pesado com muitas consultas e foreach...
Desde já agradeço!
-[b]id[/b]: int PK auto_inc
-[b]id_ingrediente[/b]: int FK
-[b]id_alimento[/b]: int FK
Preciso fazer o seguinte:
pegar o id_alimento que possuir por exemplo o id_ingrediente 8,10 e 11.
Por exemplo:
[img]http://img99.imageshack.us/img99/4784/postle.png[/img]
Preciso que ao procurar por alimentos que possuam [b]SOMENTE[/b] os ingredientes de id 9,10 e 11 me retorne o id_alimento 15!
Será que ficou claro? alguém consegue pensar em alguma query possivel? Pois estava pensando em fazer na programação, mas ficaria muito pesado com muitas consultas e foreach...
Desde já agradeço!
William Castro
Curtidas 0
Respostas
Joel Rodrigues
18/06/2012
Usar o operador IN não serviria?
SELECT * FROM TABELA WHERE ID_INGREDIENTE IN (9,10,11)
GOSTEI 0
William Castro
18/06/2012
então me disseram isso, mas nao funciona pois eu preciso que me retorne somente o id_alimento que possui esses id_ingrediente específicos!
Por exemplo: o alimento 15 possui os ingred (9,10,11) o alimento 16 possui (9,10,11,12) <- eu preciso que me retorne somente o alimento 15 que possui somente os ingredientes (9,10,11), teria algum jeito?
desde já agradeço, abraços
Por exemplo: o alimento 15 possui os ingred (9,10,11) o alimento 16 possui (9,10,11,12) <- eu preciso que me retorne somente o alimento 15 que possui somente os ingredientes (9,10,11), teria algum jeito?
desde já agradeço, abraços
GOSTEI 0
Vagner Almeida
18/06/2012
então me disseram isso, mas nao funciona pois eu preciso que me retorne somente o id_alimento que possui esses id_ingrediente específicos!
Por exemplo: o alimento 15 possui os ingred (9,10,11) o alimento 16 possui (9,10,11,12) <- eu preciso que me retorne somente o alimento 15 que possui somente os ingredientes (9,10,11), teria algum jeito?
desde já agradeço, abraços
Por exemplo: o alimento 15 possui os ingred (9,10,11) o alimento 16 possui (9,10,11,12) <- eu preciso que me retorne somente o alimento 15 que possui somente os ingredientes (9,10,11), teria algum jeito?
desde já agradeço, abraços
No lugar do SQL que o coléga informou: SELECT * FROM TABELA WHERE ID_INGREDIENTE IN (9,10,11)
substitua o código where em diante, a mesma consulta, por exemplo, ficaria assim:
SELECT * FROM TABELA WHERE (id_ingrediente = 9 and id_ingrediente = 10 and id_ingrediente = 11)
Dessa forma deve resolver seu problema, mas terá de pensar como fará para parametrizar seu programa para gerar o codigo que esta entre parênteses.
Eu faço isso em algumas consultas, e não é difícil.
Obs: Os comandos SQL abaixo retornam resultados diferentes.
SELECT id_alimentos FROM TABELA WHERE ID_INGREDIENTE IN (9,10,11)
Diferença: Retorna todos os alimentos que tiver os igredientes 9,10,11
SELECT id_alimentos FROM TABELA WHERE (id_ingrediente = 9 and id_ingrediente = 10 and id_ingrediente = 11)
Diferença: Retora todos os alimento que tiver SOMENTE os igredientes 9,10,11.
Abraços...
GOSTEI 0
William Castro
18/06/2012
Cara isso que você me passou parecia ser o essencial mesmo! Porém infelizmente não funcionou, você saberia o porque? Ou teria alguma outra idéia que complementa-se? Brigadão desde já!
Na imagem de cima a query que executei e me retornou nenhum registro
sendo que na imagem a baixo o id_alimento 3 SÓ possui estes 3 ingredientes!
http://img706.imageshack.us/img706/4982/naofuncionou.png
Na imagem de cima a query que executei e me retornou nenhum registro
sendo que na imagem a baixo o id_alimento 3 SÓ possui estes 3 ingredientes!
http://img706.imageshack.us/img706/4982/naofuncionou.png
GOSTEI 0
Joel Rodrigues
18/06/2012
Cara isso que você me passou parecia ser o essencial mesmo! Porém infelizmente não funcionou, você saberia o porque? Ou teria alguma outra idéia que complementa-se? Brigadão desde já!
Na imagem de cima a query que executei e me retornou nenhum registro
sendo que na imagem a baixo o id_alimento 3 SÓ possui estes 3 ingredientes!
http://img706.imageshack.us/img706/4982/naofuncionou.png
Na imagem de cima a query que executei e me retornou nenhum registro
sendo que na imagem a baixo o id_alimento 3 SÓ possui estes 3 ingredientes!
http://img706.imageshack.us/img706/4982/naofuncionou.png
Explicando o motivo de não ter funcionado: não tem como um mesmo campo possuir três valores diferentes. Na consulta que foi passada acima, o mesmo campo deveria assumir os valores 9, 10 e 11 ao mesmo tempo, o que não é possível.
Estou analisando aqui uma forma de fazer sua consulta. Assim que tiver resultados, posto aqui.
GOSTEI 0
William Castro
18/06/2012
Explicando o motivo de não ter funcionado: não tem como um mesmo campo possuir três valores diferentes. Na consulta que foi passada acima, o mesmo campo deveria assumir os valores 9, 10 e 11 ao mesmo tempo, o que não é possível.
Estou analisando aqui uma forma de fazer sua consulta. Assim que tiver resultados, posto aqui.
Entendi! Está bem complicado mesmo, se você tiver uma outra alternativa, mesmo que eu precise mudar os campos da tabela ou mesmo criar uma nova tabela, dará mais trabalho, mas pode ser também!
Muito obrigado mesmo cara, não manjo muito de querys mais complicadas, geralmente achava um jeito de fazer na programação, mas nesse caso não tem como em questão de desempenho fazer em programação!
Abraçoss, estou no aguardo.
GOSTEI 0
Joel Rodrigues
18/06/2012
VocÊ deve ter mais duas tabelas, tipo INGREDIENTE e ALIMENTO, certo? Essa tabela é parte de um relacionamento entre as duas, correto?
GOSTEI 0
William Castro
18/06/2012
VocÊ deve ter mais duas tabelas, tipo INGREDIENTE e ALIMENTO, certo? Essa tabela é parte de um relacionamento entre as duas, correto?
Isso mesmo, tenho a tabela ingrediente e alimento, no qual relaciono através da ingrediente_alimento quais ingredientes um determinado alimento possui!
Agora só precisaria pegar o alimento pelos ingredientes...
GOSTEI 0
Joel Rodrigues
18/06/2012
Considerando que você tem as tabelas ALIMENTOS, INGREDIENTES e INGREDIENTES_ALIMENTO, teste o seguinte:
NEsse caso você precisa passar os id_ingrediente que deseja e a quantidade de ids pesquisados, no caso, 3.
SELECT I.ID_ALIMENTO FROM INGREDIENTES_ALIMENTO I INNER JOIN ALIMENTOS A ON I.ID_ALIMENTO = A.ID WHERE I.ID_INGREDIENTE IN (9,10,11) AND (SELECT COUNT(*) FROM INGREDIENTES_ALIMENTO WHERE ID_ALIMENTO = A.ID) = 3 GROUP BY I.ID_ALIMENTO
NEsse caso você precisa passar os id_ingrediente que deseja e a quantidade de ids pesquisados, no caso, 3.
GOSTEI 0
William Castro
18/06/2012
Considerando que você tem as tabelas ALIMENTOS, INGREDIENTES e INGREDIENTES_ALIMENTO, teste o seguinte:
NEsse caso você precisa passar os id_ingrediente que deseja e a quantidade de ids pesquisados, no caso, 3.
SELECT I.ID_ALIMENTO FROM INGREDIENTES_ALIMENTO I INNER JOIN ALIMENTOS A ON I.ID_ALIMENTO = A.ID WHERE I.ID_INGREDIENTE IN (9,10,11) AND (SELECT COUNT(*) FROM INGREDIENTES_ALIMENTO WHERE ID_ALIMENTO = A.ID) = 3 GROUP BY I.ID_ALIMENTO
NEsse caso você precisa passar os id_ingrediente que deseja e a quantidade de ids pesquisados, no caso, 3.
Acabou que ele me retorna todos alimentos que possuem 3 ingredientes, pelo fato de a condição (
i.id_ingrediente IN (9,10,11)
Executei o seguinte:
SELECT I.ID_ALIMENTO FROM ingrediente_alimento I INNER JOIN alimento A ON I.ID_ALIMENTO = A.ID WHERE I.ID_INGREDIENTE IN ( 9, 10, 11 ) AND ( SELECT COUNT( * ) FROM ingrediente_alimento WHERE ID_ALIMENTO = A.ID ) =3 GROUP BY I.ID_ALIMENTO
GOSTEI 0
Joel Rodrigues
18/06/2012
Não entendi sua afirmação ´´sempre retorna TRUE mesmo nao contento os ingredientes no parâmetro.´´.
Mostra em imagem qual foi o resultado da query.
Mostra em imagem qual foi o resultado da query.
GOSTEI 0
William Castro
18/06/2012
Não entendi sua afirmação ´´sempre retorna TRUE mesmo nao contento os ingredientes no parâmetro.´´.
Mostra em imagem qual foi o resultado da query.
Mostra em imagem qual foi o resultado da query.
Quis dizer pelo fato da condição IN ser como a condição OR, se possuir um dos parametros que estao na condição ele retorna true, que foi o que aconteceu, os alimentos que só possuiam o ingrediente 9 e possuíam um total de 3 ingredientes foram retornados na query como mostra a imagem! Mas acho que falta pouco para um solução agora!
http://img440.imageshack.us/img440/4840/query1m.png
Abraços e obrigado desde já!!
GOSTEI 0