Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda em query MySql


willmk

Pergunta

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!

Editado por willmk
Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 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.

Editado por willmk
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 ?

Editado por Pompeu
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...