Ir para conteúdo
Fórum Script Brasil
  • 0

SELECT em 3 tabelas diferentes


Evandro Fontes

Pergunta

Fala galera, beleza?

Eu me deparei com um problema... Não sei se problema de estrutura do banco, ou se minha deficiencia em SQL (provável segunda opção)...

Tenho 3 tabelas, quero fazer o SELECT na tabela Estabelecimentos, trazer o ID, NOME e Descrição.

Mas na busca a pessoa pode filtrar todos os estabelecimentos de determinada área, ou filtrar por área e categoria. E ainda por cima, se ele somente fizer uma busca pelo nome trará o registro relativo, abaixo segue a estrutura básica das tabelas, tme mais campos, ams de primeira eu preciso desses campos da tabela Estabelecimentos. Fiz um SQL com JOIN puxando o id da categoria, depois um JOIN puxando o id da área, mas não deu muito certo. Depois tentei com o WHERE, e ambas as tentativas foram frustradas.. am inha dúvida é:

Tem como fazer esse SELECT, ou é necessário um campo "idArea" na tabela Estabelecimentos?

Segue a estrutura da tabela, logo após as 2 tentativas que fiz:

Estabelecimentos:

id

idCategoria

nome

desc

Categorias:

id

idArea

nome

Areas:

id

nome

----------------------

1ª Tentativa: JOIN

SELECT DISTINCT E.nome AS nome, E.descricao AS descricao, E.id AS id

FROM estabelecimentos E

JOIN categorias C ON C.id ='E.idCategoria'

JOIN areas A ON A.id ='C.idArea'

WHERE E.parceiro='1'

=======================

2ª Tentativa : WHERE

SELECT DISTINCT E.nome AS nome, E.descricao AS descricao, E.id AS id

FROM estabelecimentos E, areas A, categorias C

WHERE E.parceiro='1'

AND E.idCategoria='6'

AND C.idArea IN (SELECT idArea FROM categorias WHERE idArea='1')

AND E.nome LIKE '%teste%'

Algém tem alguma salvação ai p/ mim ?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Oi, 'Evandro Fontes'!

Primeiro, vamos corrigir um probleminha básico de nomeação de atributos.

Como boas práticas na modelagem de dados não damos nomes diferentes a atributos que executam a mesma função. Assim, suas tabelas deveriam ter os seguintes nomes de atributos corrigidos:

Estabelecimentos: atributo id deveria ser chamado de idEstabelecimento (ou qualquer coisa parecida)

Categorias: o atributo id deveria ser chamado de idCategoria (tal como está na tabela de Estabelecimentos)

Areas: o atributo id deveria ser chamado de idArea (tal como está na tabela de Estabelecimentos)

Segundo, de acordo com as novas regras, a select ficaria assim:

Conforme o exposto acima, UMA Area pode ter MUITAS Categorias e UMA Categoria pode ter MUITOS Estabelecimentos. Então

SELECT DISTINCT E.nome AS nome, E.descricao AS descricao, E.id AS id 
FROM estabelecimentos INNER JOIN Categorias C ON E.idCategoria = C.idCategoria /* no seu caso seria E.idCategoria = c.id */
INNER JOIN Areas A ON C.idArea = A.idArea /*no seu caso seria C.idArea = A.id */
WHERE E.parceiro='1'

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...