Jump to content

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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
;

 

Share this post


Link to post
Share on other sites

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. 

Share this post


Link to post
Share on other sites
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    
;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Good
      Boa tarde,
       
      temos um servidor na amazon, e o site está direcionado para o servidor. Estamos tendo um problema, de vez em quando o servidor cai. 
       
      Gostaríamos de saber se tem algum programa no ubuntu, que monitore qual arquivo que teve alto consumo. Para sabermos se o código está escrito de maneira complexa, causando a queda do servidor.
       
      Eu lembro que uma vez a hostgator mandou um relatório, avisando que tal arquivo estava consumindo muito do servidor. É possível fazer esse monitoramento? Não temos como ficar 24h olhando por exemplo o htop..
       
      Aguardo uma resposta,
      obrigado!
    • By thejhunior
      Faz um tempo que não mexo com ASP classico, precisa de uma ajuda
       
      Em uma tabela mysql, tenho a tabela de produtos, e na coluna categoria que armazena o ID de uma categoria, gostaria de ao invés de armazenar apenas um ID, gostaria de armazenar varios IDs. Como se o produtos fizesse parte de varias categorias
       
      Minha duvida e como no select poderia buscar um produtos de categoria x em uma tabela com dados separados em "," "01.02,03"
       
       
    • By lucascientista
      Boa noite, galera é o seguinte eu estou montando um script que pesquisa no banco de dados e mostrar os resultados em uma página php, bem aí que está o problema eu pesquisei alguns sistemas de paginação e de pesquisa e acabei montando meu script, no meu script a pesquisa aparece na primeira página mas quando passo para a página adiante não me é mostrado resultado nenhum já verifiquei tudo e não consigo encontrar o erro, será que alguém pode me ajudar?
       
      <?php #Incluindo a conexão no banco de dados require_once '../dao/conexao/Conexao.php'; $conexao = Conexao::getInstance(); /***********************************************/ #Aqui começa a parte a paginação e pesquisa /**********************************************/ #Limitando o número máximo de resultados que serão mostrados na tela $maximo = 1; #Armazenando o valor da página atual $pagina = isset($_GET["pagina"])? ($_GET["pagina"]): '1'; #Subtraindo 1, porque os registro começam do zero como em um array $inicio = $pagina - 1; #Multiplicamos a quantidade de registros da pagina pelo valor da pagina atual $inicio = $maximo * $inicio; #Agora chega a parte em que fazemos o SELECT para contar os resultados $sql = "SELECT * FROM centroautomotivo"; $stmt = $conexao->prepare($sql); $stmt->execute(); $contagem = $stmt->fetchAll(PDO::FETCH_ASSOC); $total = 0; if(count($contagem)){ foreach ($contagem as $linhas) { #Armazenando o total de registros da tabela para fazer a paginação $total = count($contagem); } } /******************************************************************* * Aqui vai começar a parte da pesquisa, tornando o script em um só ********************************************************************/ #Recebe o termo da pesquisa se existir $termo = (isset($_GET["termo"])) ? ($_GET["termo"]) : ''; #Executa uma pesquisa com o termo pesquisado como parametro - Este SELECT irá servir também para a paginação if(empty($termo)){ //Nada aqui } else{ $sql = "SELECT * FROM centroautomotivo WHERE nomefantasia LIKE :nomefantasia or email LIKE :email ORDER BY idCentro LIMIT $inicio,$maximo"; $stm = $conexao->prepare($sql); $stm->bindValue(':nomefantasia', '%'.$termo.'%'); $stm->bindValue(':email', '%'.$termo.'%'); $stm->execute(); $autocenters = $stm->fetchAll(PDO::FETCH_ASSOC); } <?php require_once '../includes/header.php'; require_once '../controller/paginacaoPesquisaCentro.php'; ?> <div class="container mb-5"> <h1 class="text text-center">Centros Automotivos</h1> <p class="text text-center">Encontre o centro automotivo que mais se encaixa com você</p> <!--Formulário de pesquisa com paginação--> <form method="GET" action=""> <div class="d-flex flex-column bd-highlight mb-3"> <div class="p-2 bd-highlight"><img src="../img/Logotipo.png" class=" img-fluid rounded mx-auto d-block"></div> <div class="p-2 bd-highlight d-flex justify-content-center" style="margin-top: -10px;"><input type="text" name="termo" class="form-control" style=" width: 60%;" placeholder="Pesquise pelo Centro Automotivo!"/></div> <div class="p-2 bd-highlight d-flex justify-content-center"><button type="submit" class="btn btn-outline-primary"><i class="fas fa-search"></i>&nbsp;Pesquisar</button></div> </div> </form> <!--Fim do formuláio de pesquisa--> <!--Início dos resultados da pesquisa--> <?php if(!empty($autocenters)){?> <?php foreach ($autocenters as $autocenter) { ?> <center> <div class="card mb-3" style="max-width: 540px;"> <div class="row no-gutters"> <div class="col-md-4"> <img src="../controller<?php empty($autocenter["foto"])? 'images/pic.png' : $autocenter["foto"] ?>" class="card-img img-fluid" width="150px" height="150px"> </div> <div class="col-md-8"> <div class="card-body"> <p class="card-text text-justify"><?php $autocenter["nomefantasia"]?></p> <p class="card-text text-justify"><small class="text-muted"><?=$autocenter["email"]?></small></p> </div> </div> </div> </div> </center> <?php }//Fechamento do foreach?> <div id="alignpaginacao"> <?php //determina de quantos em quantos links serão adicionados e removidos $max_links = 6; //dados para os botões $previous = $pagina - 1; $next = $pagina + 1; //usa uma funcção "ceil" para arrendondar o numero pra cima, ex 1,01 será 2 $pgs = ceil($total / $maximo); //se a tabela não for vazia, adiciona os botões if($pgs > 1 ){ echo "<br/>"; //botao anterior if($previous > 0){ echo "<div id='botaoanterior'><a href=".$_SERVER['PHP_SELF']."?termo={$termo}?pagina=$previous><input type='submit' name='bt-enviar' id='bt-enviar' value='Anterior' class='button' /></a></div>"; } else{ echo "<div id='botaoanteriorDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$previous><input type='submit' name='bt-enviar' id='bt-enviar' value='Anterior' class='button' disabled='disabled'/></a></div>"; } echo "<div id='numpaginacao'>"; for($i=$pagina-$max_links; $i <= $pgs-1; $i++) { if ($i <= 0){ //enquanto for negativo, não faz nada }else{ //senão adiciona os links para outra pagina if($i != $pagina){ if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a> ..."; }else{ echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a>"; } } else{ if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos echo "<span class='current'> ".$i."</span> ..."; }else{ echo "<span class='current'> ".$i."</span>"; } } } } echo "</div>"; //botao proximo if($next <= $pgs){ echo " <div id='botaoprox'><a href=".$_SERVER['PHP_SELF']."?termo={$termo}?pagina=$next><input type='submit' name='bt-enviar' id='bt-enviar' value='Proxima' class='button'/></a></div>"; }else{ echo " <div id='botaoproxDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$next><input type='submit' name='bt-enviar' id='bt-enviar' value='Proxima' class='button' disabled='disabled'/></a></div>"; } } ?> </div> <?php }//Fechamento do if?> <!--Fim dos resultados da pesquisa--> <!--Início da paginação--> <!--Fim da paginação--> </div> <?php require_once '../includes/footer.php'; ?>  
      Bem aí está meu código, fico muito agradecido se puderem me ajudar.
    • By Mucio Willamys
      olá, gostaria da ajuda de vcs :
      este código traz as informações do banco de dados e as coloca dentro de um select html
      é parte de um projeto de um sistema de uma clínica médica, onde ao cadastrar os médicos posso escolher a especialidade do mesmo.
      <select name="especialidade" required="">                 <option value="" >--Escolha uma especialidade--</option>          <?php              $result_especialidade = "select * from especialidade";              $result_especialidade = mysqli_query($bd, $result_especialidade);              while ($row_especialidade = mysqli_fetch_assoc($result_especialidade)){ ?>                    <option value="<?php echo $row_especialidade['id']; ?>"><?php echo  $row_especialidade['nome']; ?> </option> public function editar($id){ include "Bd.class.php"; $nome = $this->nome; $cpf = $this->cpf; $crm = $this->crm; $especialidade = $this->especialidade; $query = "update medico set nome = '$nome', cpf = '$cpf', crm = '$crm', especialidade_id = '$especialidade' where id = $id"; $status = $bd->query($query); return $status; } Acima ^ está a função editar...
       
       
       
      abaixo está o form com as informações do médico.
      <form method="POST" action="../controller/Controller-medico.php?op=e"> <input type="hidden" name="id" size="5" value="<?php echo $id; ?>" > <div class="campo"> <label for="nome">Nome: </label> <input type="nome" name="nome" size="30" value="<?php echo $m->getNome() ?>"> </div> <div class="campo"> <label for="cpf">CPF: </label> <input type="text" name="cpf" size="30" value="<?php echo $m->getCpf() ?>"> </div> <div class="campo"> <label for="rg">CRM: </label> <input type="text" name="crm" size="30" value="<?php echo $m->getCrm() ?>"> </div> <div class="campo"> <label for="especialidade"> Especialidade: </label> </div> <div class="campo"> <input type="submit" value="Atualizar"> </div> </form> Gostaria de saber como faço pra setar um input ou um select no caso para a alteração do dado(especialidade)?
    • By Marcosvn
      Estou trabalhando num projeto que será semelhante a um fórum de discussão. No entanto, além de criar o tópico, o usuário deverá responder a um questionário com 40 perguntas. Essas perguntas serão armazenadas e exibidas posteriormente em forma de gráficos com o resultado estatístico de todos os usuários que responderam o questionário.
       
      Minha pergunta é: mysql seria uma boa escolha para esse projeto?
       
      Com o tempo, conforme a quantidade de respostas aumenta, não ficaria muito lento o calculo e exibição dos gráficos?
       
      Qual o melhor caminho a seguir para eu não ter problemas de velocidade no futuro?
       
      abraço
       
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.