Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tem uma tabela que relaciona os produtos de uma determinada compra, onde preciso consultar diversos produtos e retornar os ids das compras que tenham todos os produtos que consultei, em uma estrutura parecida com o exemplo abaixo:
SELECT * FROM produtos_has_compras WHERE (idProduto = 6 AND idProduto = 77 AND idProduto = 11) GROUP BY idCompra;
Alguém teria uma solução que possa me ajudar?Obrigado meu caro, ms com IN não funciona porque irá trazer compras (ids) que podem ter comprado apenas um produto e não todos. Esse é o grande problema, preciso que retorne as compras que tenham todos os produtos.
>
5 minutos atrás, ShadowDLL disse:
Segue exemplo:
SQLs a SER UTILIZADAS
CREATE TABLE produtos (
idProduto INT NOT NULL AUTO_INCREMENT,
nomeProduto VARCHAR(50) NOT NULL,
PRIMARY KEY(idProduto)
);
INSERT INTO produtos (nomeProduto) VALUES
('Suco de Laranja'),
('Fita Branca'),
('Linha Branca'),
('Creme');
CREATE TABLE compras (
idCompra INT NOT NULL AUTO_INCREMENT,
dataCompra DATE NOT NULL,
PRIMARY KEY(idCompra)
);
INSERT INTO compras (dataCompra) VALUES
(CURRENT_DATE),
(CURRENT_DATE);
CREATE TABLE produtos_has_compras (
idItem INT NOT NULL AUTO_INCREMENT,
idCompra INT NOT NULL,
idProduto INT NOT NULL,
quantidade INT(5) NOT NULL,
PRIMARY KEY(idItem),
FOREIGN KEY(idCompra) REFERENCES compras (idCompra),
FOREIGN KEY(idProduto) REFERENCES produtos (idProduto)
);
INSERT INTO produtos_has_compras (idCompra, idProduto, quantidade) VALUES
(1, 1, 10),
(1, 3, 1),
(1, 2, 1),
(2, 4, 2),
(2, 1, 1);
**QUERY**
SELECT
idCompra
FROM
produtos_has_compras
WHERE
idProduto IN (1, 2, 3)
GROUP BY
idCompra
;
>
6 minutos atrás, ShadowDLL disse:
Segue exemplo:
SQLs a SER UTILIZADAS
CREATE TABLE produtos (
idProduto INT NOT NULL AUTO_INCREMENT,
nomeProduto VARCHAR(50) NOT NULL,
PRIMARY KEY(idProduto)
);
INSERT INTO produtos (nomeProduto) VALUES
('Suco de Laranja'),
('Fita Branca'),
('Linha Branca'),
('Creme');
CREATE TABLE compras (
idCompra INT NOT NULL AUTO_INCREMENT,
dataCompra DATE NOT NULL,
PRIMARY KEY(idCompra)
);
INSERT INTO compras (dataCompra) VALUES
(CURRENT_DATE),
(CURRENT_DATE);
CREATE TABLE produtos_has_compras (
idItem INT NOT NULL AUTO_INCREMENT,
idCompra INT NOT NULL,
idProduto INT NOT NULL,
quantidade INT(5) NOT NULL,
PRIMARY KEY(idItem),
FOREIGN KEY(idCompra) REFERENCES compras (idCompra),
FOREIGN KEY(idProduto) REFERENCES produtos (idProduto)
);
INSERT INTO produtos_has_compras (idCompra, idProduto, quantidade) VALUES
(1, 1, 10),
(1, 3, 1),
(1, 2, 1),
(2, 4, 2),
(2, 1, 1);
**QUERY**
SELECT
idCompra
FROM
produtos_has_compras
WHERE
idProduto IN (1, 2, 3)
GROUP BY
idCompra
;
Obrigado meu caro, mas com IN não funciona porque irá trazer compras (ids) que podem ter comprado apenas um produto e não todos. Esse é o grande problema, preciso que retorne as compras que tenham todos os produtos.
as compras que tenham todos os produtos
Da sql acima
SELECT
idCompra
FROM
produtos_has_compras
WHERE
idProduto IN (1, 2, 3)
GROUP BY
idCompra
HAVING Count(distinct idProduto) = 3
;
Segue exemplo:
SQLs a SER UTILIZADAS
('Suco de Laranja'), ('Fita Branca'), ('Linha Branca'), (CURRENT_DATE), (1, 1, 10), (1, 3, 1), (1, 2, 1), (2, 4, 2), FROM produtos_has_compras WHERE idProduto IN (1, 2, 3) GROUP BY idCompra ;