Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Erro de sintaxe na ultima linha.
Existe outra alternativa sem sem com dois SELECTs?
Valeu.
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.
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.
Veja se isto ajuda.
Realmente isso retornou os resultados esperados. O problema é que não entendi nada. Você poderia me explicar?
SELECT NULL? Essa é nova para mim :)
Valeu, obrigado de novo.
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).
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.
Uma solução básica
select *
from veiculos
Entre outras.