Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Prove Yourself

[Resolvido] Relação N para N: Buscar apenas os veículos que conte

Recommended Posts

Estou criando uma busca de veículos no meu site. O usuário poderá filtar esta busca por acessórios. Por exemplo.

 

João acessa a página de busca e marca que quer ver os carros que tenham vidro elétrico e trava elétrica.

 

A estrutura das minhas tabelas é a seguinte:

 

CREATE TABLE `veiculos` (
   `id` INT NOT NULL PRIMARY KEY,
   `placa` VARCHAR(8)
);

CREATE TABLE `acessorios` (
  `id` INT NOT NULL PRIMARY KEY,
  `nome` VARCHAR(255)
);

CREATE TABLE `acessoriosveiculos` (
  `id` INT NOT NULL PRIMARY KEY,
  `veiculoid` INT NOT NULL,
  `acessorioid` INT NOT NULL,
  FOREIGN KEY (veiculoid) REFERENCES veiculos(id),
  FOREIGN KEY (acessorioid) REFERENCES acessorios(id)
);

 

Um carro pode ter N acessórios e um acessório pode fazer parte de N carros.

 

Já tentei de várias formas mas não consigo de jeito nenhum:

 

SELECT veiculos.*
   FROM veiculos
   INNER JOIN acessoriosveiculos ON acessoriosveiculos.veiculoid = veiculos.id
   WHERE (acessoriosveiculos.acessorioid = 1 and acessoriosveiculos.acessorioid = 2);

 

Alguém pode me ajudar a montar esta query? Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução básica

 

select *
from veiculos
where id in (select veiculoid
            from acessoriosveiculos
            where acessorioid in (1,2)

 

Entre outras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

select *
from veiculos
where id in (select veiculoid
            from acessoriosveiculos
            where acessorioid in (1,2))

 

Existe outra alternativa sem sem com dois SELECTs?

 

Sim, mas creio ser mais prático assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda Motta.

Esta query ainda não retorna o que eu preciso. Por exemplo.

Tenho um veículo com os dois acessórios, 1 e 2. E outro que tem a apenas o acessório 1.

Se eu utilizar esta query ele está retornando os dois veículos. Ele deveria retornar apenas os veículos que têm 1 E 2.

Vou continuar tentando.

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Exists testa se a subquery retorna alguma coisa, como pode ser qualquer coisa se usa null para se economizar no tráfego de rede (dados).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acabei resolvendo de outra forma:

 

SELECT `veiculos`.* FROM `veiculos`
   JOIN `acessoriosveiculos` ON (`veiculos`.`id` = `acessoriosveiculos`.`veiculoid`)
   WHERE `acessoriosveiculos`.`acessorioid` IN (1, 2)
       GROUP BY `veiculos`.`id` HAVING count(`veiculos`.`id`) = 2

Assim ficou mais claro pra mim, eu que tenho poucos conhecimentos em SQL.

Valeu, obrigadão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.