Jump to content
Fórum Script Brasil
  • 0

Ajuda em query MySql


willmk
 Share

Question

Possuo a seguinte tabela:

-id: int PK auto_inc

-id_ingrediente: int FK

-id_alimento: int FK

Preciso fazer o seguinte:

pegar o id_alimento que possuir por exemplo o id_ingrediente 8,10 e 11.

Por exemplo:

postle.png

Preciso que ao procurar por alimentos que possuam SOMENTE 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!

Edited by willmk
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

Nossa cara brigadão!

Isso funciona certinho, não conhecia essa condição!

Porém eu precisaria que me retornasse 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?

Obrigado desde já!

Abraços.

Edited by willmk
Link to comment
Share on other sites

  • 0

Mais ninguém?

já falaram para eu tentar o seguinte:

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

Porém ele me retorna todos os registro que possuam pelo menos 1 dos ingredientes listados no IN (9,10,11)

Preciso do registro específico que possui aquela quantidade e aqueles ingredientes!

Link to comment
Share on other sites

  • 0
SELECT id_alimento FROM tabela WHERE (id_ingredientes = 8 OR id_ingredientes = 9 OR id_ingredientes = 10)
GROUP BY id_alimento

Também não cara, esse me retorna TODOS que tiveram qualquer um dos ingredientes listados ali, eu preciso um que retorno o alimento que tem SOMENTE esses 3 ingredientes 8,9,10!

Nessa query se eu trocar OR por AND ele me retorna vazio..

Mas obrigado desde já!

Fico no aguardo de uma solução..

Link to comment
Share on other sites

  • 0
SELECT id_alimento FROM tabela WHERE (id_ingredientes = 8 OR id_ingredientes = 9 OR id_ingredientes = 10)
GROUP BY id_alimento

Também não cara, esse me retorna TODOS que tiveram qualquer um dos ingredientes listados ali, eu preciso um que retorno o alimento que tem SOMENTE esses 3 ingredientes 8,9,10!

Nessa query se eu trocar OR por AND ele me retorna vazio..

Mas obrigado desde já!

Fico no aguardo de uma solução..

Tire o "Group By id_alimento", testei o SELECT acima e funcionou, só uma dúvida, por acaso você queria que retornasse o total de ingredientes pra fazer uma compra por exemplo ?

Edited by Pompeu
Link to comment
Share on other sites

  • 0
SELECT id_alimento FROM tabela WHERE (id_ingredientes = 8 OR id_ingredientes = 9 OR id_ingredientes = 10)
GROUP BY id_alimento

Também não cara, esse me retorna TODOS que tiveram qualquer um dos ingredientes listados ali, eu preciso um que retorno o alimento que tem SOMENTE esses 3 ingredientes 8,9,10!

Nessa query se eu trocar OR por AND ele me retorna vazio..

Mas obrigado desde já!

Fico no aguardo de uma solução..

Tire o "Group By id_alimento", testei o SELECT acima e funcionou, só uma dúvida, por acaso você queria que retornasse o total de ingredientes pra fazer uma compra por exemplo ?

Cara, mesma coisa! Eu preciso do id_alimento que possui APENAS os ingredientes 8,9,10 desse modo ele me retorna QULAQUER id_alimento que possui OU o 8 OU 9 OU 10

Link to comment
Share on other sites

  • 0

Acho que entendi o que quer fazer, você provavelmente está armazenando várias informações no campo id_alimento, deve estar assim:

id_alimento = 8 9 10

E NÃO ASSIM

id_alimento = 8

id_alimento = 9

id_alimento = 10

NÃO É ISSO ?

Nesse caso acho que poderia usar o comando LIKE %8 9 10% que busca parte do texto. Qual é o tipo do campo ? tipo CHAR, VARCHAR, INT, etc.

SUGESTÃO:

porque não cria uma outra tabela e armazena cada ingrediente em um campo ? ou cria um campo pra cada ingrediente na mesma tabela.

Link to comment
Share on other sites

  • 0
Acho que entendi o que quer fazer, você provavelmente está armazenando várias informações no campo id_alimento, deve estar assim:

id_alimento = 8 9 10

E NÃO ASSIM

id_alimento = 8

id_alimento = 9

id_alimento = 10

NÃO É ISSO ?

Nesse caso acho que poderia usar o comando LIKE %8 9 10% que busca parte do texto. Qual é o tipo do campo ? tipo CHAR, VARCHAR, INT, etc.

SUGESTÃO:

porque não cria uma outra tabela e armazena cada ingrediente em um campo ? ou cria um campo pra cada ingrediente na mesma tabela.

Não eu armazeno como mostra na imagem do primeiro post!

-id PK

-id_ingrediente FK

-id_alimento FK

Não tem como eu fazer um campo para cada ingrediente na mesma tabela, pois o cadastro de ingredientes também é dinamico e tem mais de 100 ingredientes, ficaria uma tabela enorme o que não compensa.

Acho que não existe nenhum comando que eu possa executar no banco que me retorne o id_alimento pelos id_ingrediente que possui. Achei um jeito de fazer na programação mas me custou 3 foreachs intercalados, o que come muito processamento, mas acho que vai ter que ser desse jeito :(

Muito obrigado a todos!!

Link to comment
Share on other sites

  • 0
Possuo a seguinte tabela:

-id: int PK auto_inc

-id_ingrediente: int FK

-id_alimento: int FK

Preciso fazer o seguinte:

pegar o id_alimento que possuir por exemplo o id_ingrediente 8,10 e 11.

Por exemplo:

postle.png

Preciso que ao procurar por alimentos que possuam SOMENTE 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!

Tente assim:

select tab.id_alimento, tab.ingrediente
from (select id_alimento, group_concat(id_ingrediente) as ingrediente
         from tabela
         group by id_alimento)) tab
where tab.ingrediente = "9,10,11"

Link to comment
Share on other sites

  • 0
Possuo a seguinte tabela:

-id: int PK auto_inc

-id_ingrediente: int FK

-id_alimento: int FK

Preciso fazer o seguinte:

pegar o id_alimento que possuir por exemplo o id_ingrediente 8,10 e 11.

Por exemplo:

postle.png

Preciso que ao procurar por alimentos que possuam SOMENTE 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!

Tente assim:

select tab.id_alimento, tab.ingrediente
from (select id_alimento, group_concat(id_ingrediente) as ingrediente
         from tabela
         group by id_alimento)) tab
where tab.ingrediente = "9,10,11"

Deu o seguinte erro:

"#1248 - Every derived table must have its own alias"

Link to comment
Share on other sites

  • 0

Desculpe coloquei um parentese a mais

Tente assim:

select tab.id_alimento, tab.ingrediente
from (select id_alimento, group_concat(id_ingrediente) as ingrediente
         from tabela
         group by id_alimento) tab
where tab.ingrediente = "9,10,11"

Link to comment
Share on other sites

  • 0
Desculpe coloquei um parentese a mais

Tente assim:

select tab.id_alimento, tab.ingrediente
from (select id_alimento, group_concat(id_ingrediente) as ingrediente
         from tabela
         group by id_alimento) tab
where tab.ingrediente = "9,10,11"

tente isso

SELECT id_alimento FROM tabela WHERE (id_ingredientes = 8 && id_ingredientes = 9 && id_ingredientes = 10)

GROUP BY id_alimento

ou

SELECT id_alimento FROM tabela WHERE id_ingredientes between 8 and 10;

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.8k
×
×
  • Create New...