Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvidas quanto a seleção em relacionamentos n pra n.

Boa tarde!

Queria saber como eu faço pra selecionar um valor que tem uma tabela intermediária entre duas tabelas n para n?

Exemplo, construi um banco de dados que tem as seguintes tabelas com os seguintes relacionamentos:

create database bd_cafe;

use bd_cafe;

create table cafes (id_cafe int auto_increment, nome_cafe varchar(30) not null,
    descricao_cafe varchar(50), id_intensidade_cafe int, id_familia_cafe int,
    id_classificacao_cafe int, id_marca_cafe int,
    primary key (id_cafe));

create table classificacao (id_classificacao int auto_increment, desc_clas varchar(30) not null,
    primary key (id_classificacao));

create table marca (id_marca int auto_increment, nome_marca varchar(30),
    primary key (id_marca));

create table xicara_cafe (id_cafe int, id_xicara int,
    primary key (id_cafe, id_xicara));

create table xicara (id_xicara int auto_increment, nome_xicara varchar(30) not null,
    primary key (id_xicara));

create table intensidade (id_intensidade int(2) primary key);

create table familia (id_familia int auto_increment, nome_familia varchar(30) not null,
    primary key (id_familia));



alter table cafes add foreign key (id_intensidade_cafe) references intensidade(id_intensidade);

alter table cafes add foreign key (id_familia_cafe) references familia(id_familia);

alter table cafes add foreign key (id_classificacao_cafe) references classificacao(id_classificacao);

alter table cafes add foreign key (id_marca_cafe) references marca(id_marca);

alter table xicara_cafe foreign key (id_cafe) references cafes(id_cafe);

alter table xicara_cafe foreign key (id_xicara) references xicara(id_xicara);

Alguns cafés podem preparar até 2 tipos de bebidas (ex: Ristretto e Espresso). Outros podem preparar somente um tipo. A dúvida é, como eu faço para selecionar um valor (no caso o nome do café), que só prepara um único tipo de café?

Imagem do esquema do banco para uma melhor compreensão:

http://ap.imagensbrasil.org/image/EDJGny

4 respostas

Ficou confuso esse tipo porque não existe essa tabela tipo. Imagino que você esta chamando esse negócio de tipo como marca. Se for creio que o código a baixo resolve. Se não for explique melhor o que é esse tipo de café.

select c.Nome_cafe, m.Nome_marca from Cafe c Inner Join
Marca m On m.id_marca = c.id_marca_cafe where m.Nome_marca = 'Espresso'

Att. Fabiano Farah

Fabiano, ficou realmente confuso. Vou tentar simplificar um pouco mais e tentar desenhar as tabelas:

cafes
---------------
id_cafe    nome
    1        cafe_a    
    2        cafe_b
    3        cafe_c
    4        cafe_d

xicara_cafe
---------------
id_cafe    id_xicara
    1        1    
    2        1
    2        2
    3        3
    4        2

xicara
---------------
id_xicara    nome
    1        espresso    
    2        ristretto
    3        lungo

A dúvida é, qual é a query que eu uso para selecionar o café que faz somente a xícara 'espresso'?

Se eu fizer a query:

SELECT cafes.nome FROM cafes
INNER JOIN xicara_cafe ON cafes.id_cafe = xicara_cafe.id_cafe
INNER JOIN xicara ON xicara_cafe.id_xicara = xicara.id_xicara
WHERE xicara.nome_xicara = 'espresso'

Ele traz pra mim todos os nomes dos cafés que faz a xícara 'espresso' (mas que também fazem outras xícaras além do espresso).

No exemplo que citei acima, ele tem que me retornar somente o 'café_a', que é o único que prepara somente a xícara 'espresso'.

Espero que minha dúvida tenha ficado mais clara.

Desde já agradecido pela ajuda do grupo.

SELECT c.nome FROM cafes c
INNER JOIN xicara_cafe xc ON c.id_cafe = xc.id_cafe
INNER JOIN xicara x ON xc.id_xicara = x.id_xicara
WHERE x.id_xicara = 1 and c.id_cafe = 1
solução!

Fabiano, infelizmente sua query ainda não m ajudou, pois ela filtra especificamente o café com id = 1 e não é isso que eu quero. Quero que ela compare todos os cafés.

Felizmente consegui encontrar a resposta:

SELECT c.nome FROM cafes c
JOIN xicara_cafes xc ON xc.id_cafe = c.id_cafe
JOIN xicara x ON x.id_xicara = xc.id_xicara
WHERE x.nome = 'espresso'

AND c.nome NOT IN
                (
                    SELECT c.nome FROM cafes c
                    JOIN xicara_cafes xc ON xc.id_cafe = c.id_cafe
                    JOIN xicara x ON x.id_xicara = xc.id_xicara
                    WHERE x.nome <> 'espresso'
                )

Essa é a solução que eu queria :)

Valeu pela ajuda!