Boa noite,
Então, como não houveram respostas, vou arriscar propondo uma solução.
Modelei aqui, e a ideia que proponho é você obter da lista do que compõe a maior quantidade de itens para um determinado produto. Modelei e abaixo segue script para criação, popular e um exemplo do que pensei.
CRIANDO TABELAS
CREATE TABLE produto (
codProduto INT AUTO_INCREMENT NOT NULL,
nomeProduto VARCHAR(100) NOT NULL,
PRIMARY KEY (codProduto)
);
CREATE TABLE materia (
codMateria INT AUTO_INCREMENT NOT NULL,
nomeMateria VARCHAR(20) NOT NULL,
PRIMARY KEY (codMateria)
);
CREATE TABLE materia_produto (
codProduto INT NOT NULL,
codMateria INT NOT NULL,
qtdMateria DECIMAL(10) NOT NULL,
PRIMARY KEY (codProduto, codMateria)
);
ALTER TABLE materia_produto ADD CONSTRAINT produto_materia_produto_fk
FOREIGN KEY (codProduto)
REFERENCES produto (codProduto)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE materia_produto ADD CONSTRAINT materia_materia_produto_fk
FOREIGN KEY (codMateria)
REFERENCES materia (codMateria)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Inserindo dados e Exemplos ( OS COMENTÁRIOS NA SQL PODEM FALHAR NA EXECUÇÃO )
------ cadastrando
select *
from materia ;
insert into materia VALUES (1 , 'Pão') ;
insert into materia VALUES (2 , 'Presunto') ;
insert into materia values(3, 'Alface');
INSERT INTO produto VALUES ( 1 , 'Sanduiche') ;
INSERT INTO produto VALUES ( 2 , 'Natureba') ;
SELECT * FROM MATERIA_PRODUTO;
INSERT INTO materia_produto values (1,1,1) ;
INSERT INTO materia_produto values (1,2,3) ;
INSERT INTO materia_produto values (2,3,2) ;
SELECT * FROM materia_produto ;
---- buscando por SANDUICHE , itens Pão e Presunto
SELECT
materia_produto.codProduto,
produto.nomeProduto,
COUNT(materia_produto.codProduto) maisApareceu
FROM
materia_produto
INNER JOIN materia on materia.codMateria = materia_produto.codMateria
inner JOIN produto on produto.codProduto = materia_produto.codProduto
WHERE materia_produto.codMateria in (1,2)
GROUP BY codProduto
order by maisApareceu DESC
limit 0,1
---- buscando por NATUREBA , itens Pão e Alface
SELECT
materia_produto.codProduto,
produto.nomeProduto,
COUNT(materia_produto.codProduto) maisApareceu
FROM
materia_produto
INNER JOIN materia on materia.codMateria = materia_produto.codMateria
inner JOIN produto on produto.codProduto = materia_produto.codProduto
WHERE materia_produto.codMateria in (1,3)
GROUP BY codProduto
order by maisApareceu DESC
limit 0,1