Jump to content


Photo

2 Consultas


  • Faça o login para participar
11 replies to this topic

#1 InSoNiA

InSoNiA

    Novato no fórum

  • Usuários
  • 20 posts
  • Sexo:Não informado

Posted 05/01/2008, 17:40

Olá pessoa, estou com uma dificuldade muito grande com consultas relacionadas e impressão dos resultados. Pesquisei bastante inclusive em sites de MySQL, porém to com muita deificuldade em entender o lance do JOIN, assim sendo vou tentar expressar da melhor forma para que alguém possa me ajudar, pois é bem simples eu que to confuso.


Tenho um sistema onde são listadas as EMPRESAS cadastradas de várias cidades, ao lados da lista tem um LINK para uma página com mais informações onde esta página imprime os dados detalhado da empresa SELECIONADA através do link.

O cadastro está dividido em DUAS tabelas, sendo TABELA empresas e TABELA cidades onde tem as seguintes estruturas:

cidades
id // ID autoincremento
cidade // Nome da cidade

empresas
id // Aqui ID autoincremento
empresa // Aqui o nome da empresa
cidade // Aqui fica armazenado o ID da cidade


Como existem duas TABELAS quando faço a primeira SQL empresas imprimo os dados bunitinhu, porém o campo CIDADE da TABELA EMPRESAS armazena o ID da TABELA CIDADES e não o nome EM SI, assim sendo imprime o ID sendo que eu quero que imrpima o nome da cidade.

Assim sendo to fazendo DUAS SQL, sendo que eu queria aprender a usar o JOIN para não ter de ficar fazendo VÁRIAS SQL para um único resultado.

Segue abaixo meu código:

[codebox]
$id = $_GET['id'];
$sql = "SELECT * FROM busca_empresas WHERE id_empresa = '$id'";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$sql_cidade = "SELECT busca_cidades.cidade FROM busca_cidades WHERE busca_cidades.id_cidade = ".$row['cidade']."";
$res_cidade = mysql_query($sql_cidade);
$row_cidade = mysql_fetch_array($res_cidade);
[/codebox]

echo $row['cidade']; // Aqui imprime 1
echo $row_cidade['cidade']; // Aqui aparece Rio Claro CORRETO

Como fazer a consulat acima em uma ÚNICA SQL?


Minha segunda pergunta é como vou imprimir isso?
Usando um único $row['?????']; // To fazendo consulta em DUAS tabelas por isso não saberia como imrimir os resultados

Espero ter sido claro e que alguém possa me ajudar!

Desde já agradeço!

#2 Marcivone

Marcivone

    12 Horas

  • Usuários
  • 200 posts
  • Sexo:Masculino
  • Localidade:Redenção-PA

Posted 05/01/2008, 22:43

Amigo eu estava com um problema semelhate a uns tres dias atrás, mais consegui resolver, pelo que entendi acho q seu SELECT ficaria assim:

("SELECT empresas.empresa, cidades.cidade FROM empresas
JOIN cidades ON empresas.cidade = cidades.cidade
WHERE id_empresa = '$id'");



Testa ai, qualquer coisa posta novamente...

Valeu

Edição feita por: Marcivone, 05/01/2008, 23:04.


#3 Jeison Free

Jeison Free

    Turista

  • Usuários
  • 54 posts
  • Sexo:Não informado

Posted 05/01/2008, 23:21

Nesse caso creio que não seria correto usar o JOIN pois primeiro você terá q fazer uma consuta em empresas e depois em cidades pois o id da cidade pode ser diferende do id da empresa alem disso pode haver mais cidades com a mesma empresa coisas desse tipo
Poster de
www.iesart.com
www.pagelessbrasil.com
www.scriptbrasil.com.br (scripts)

<?php alem do limite

#4 Marcivone

Marcivone

    12 Horas

  • Usuários
  • 200 posts
  • Sexo:Masculino
  • Localidade:Redenção-PA

Posted 05/01/2008, 23:25

Olá caro Jason Free, mais neste caso que demonstrei acima ele vai pegar o id da cidade q está no cadastro da empresa, e ele faz a busca primeiro na empresa e verifica qual a cidade e só depois busca na tabela cidades.

#5 Jeison Free

Jeison Free

    Turista

  • Usuários
  • 54 posts
  • Sexo:Não informado

Posted 05/01/2008, 23:33

então!

mas e se você um empresa em mais de uma cidade, eu já estou pensando alem disso
o correto era ser o contraio se vc quer diminuir as buscas

por ex

empresa x tem na cidade 1 2 3 4

vc vai ter apenas uma busca por 1 depois por 2 ...

se vc colocar na cidade a emprese q tem nela
vc apenas vai ter uma busca

ex empresa x id 1

cidadade 1 tem
cidadade 2 tem
cidadade 3 não tem

assim vc só usa uma busca


e Marcivone eu entendei XD

Edição feita por: Jeison Free, 05/01/2008, 23:37.

Poster de
www.iesart.com
www.pagelessbrasil.com
www.scriptbrasil.com.br (scripts)

<?php alem do limite

#6 Marcivone

Marcivone

    12 Horas

  • Usuários
  • 200 posts
  • Sexo:Masculino
  • Localidade:Redenção-PA

Posted 05/01/2008, 23:38

Pelo que entendi ele faz a busca pelo id da empresa, assim ele não teria problemas pq cada empresa um id diferente...


E Jeison, tive vendo outras respostas suas, e gostei bastante, PARABÉNS...

comecei a pouco no PHP, e foi tudo graças a este forum, a intenção é só ajudar.

Edição feita por: Marcivone, 05/01/2008, 23:41.


#7 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 05/01/2008, 23:39

Nesse caso creio que não seria correto usar o JOIN pois primeiro você terá q fazer uma consuta em empresas e depois em cidades pois o id da cidade pode ser diferende do id da empresa alem disso pode haver mais cidades com a mesma empresa coisas desse tipo

Isso não afeta em nada.

Se em me lembro bem a consulta seria assim:

SELECT empresa.*, cidade.cidade FROM busca_empresas AS empresa LEFT JOIN busca_cidades AS cidade ON empresa.cidade = cidade.id_cidade WHERE empresa.id_empresa = $id
PS: Não testei. :P
PS: Movendo pro local adequado. B)

[]’s :DAté mais

#8 Alexx Ares

Alexx Ares

    Doutor

  • Usuários
  • 921 posts
  • Sexo:Masculino
  • Localidade:Santos - SP

Posted 06/01/2008, 06:35

Gostaria de aproveitar o tópico para tirar uma dúvida relacionada:

Suponha as duas tabelas:

grupos
- id (int)
- titulo (varchar)

contatos
- id (int)
- nome (varchar)
- email (varchar)
- grupo (int)

A idéia é praticamente a mesma do exemplo do tópico: o campo grupo na tabela contatos grava o id do grupo relacionado na tabela grupos.
Assim, ao selecionar um registro em contatos, o grupo do registro será um número, e deverá então consultar a tabela grupos para ver qual o título.

Agora além de fazer uma única consulta já retornando o titulo do grupo ao invés do ID apenas, tem como ainda ordenar o resultado em ordem alfabética pelo nome do grupo? Pois o select "normal" apenas na tabela contatos, se ordenar pelo campo grupo vai ordenar pela ordem numérica, sendo que se 1=Trabalho e 2=Amigos já teremos um resultado não ordenado alfabeticamente.

Muito complicado??

:lol:(y)
||| PENSE NISSO ||| O ser humano, dizem, deve dormir 8 horas por dia. Isso equivale a 1 terço do seu dia dormindo. Agora imagine a seguinte situação: você, com 75 anos, prestes a morrer, olha para trás e percebe que dormiu 1 terço da sua vida, ou seja, 25 anos. Cara... 25 ANOS DORMINDO !!! Se você tem menos de 25 anos, simplesmente você vai dormir mais do que viveu até hoje!!! Pense nisso... e durma menos.

#9 Jeison Free

Jeison Free

    Turista

  • Usuários
  • 54 posts
  • Sexo:Não informado

Posted 06/01/2008, 09:07

cara é a mesma coisa

vc vai ter o grupo 1

então faz uma pesquisa na tabela contatos listando os nomes buscando somente os que tiverem grupo igual o id grupo e depois vc manda ordenar em ASC

flws ^^
Poster de
www.iesart.com
www.pagelessbrasil.com
www.scriptbrasil.com.br (scripts)

<?php alem do limite

#10 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 06/01/2008, 12:46

A idéia é praticamente a mesma do exemplo do tópico: o campo grupo na tabela contatos grava o id do grupo relacionado na tabela grupos.
Assim, ao selecionar um registro em contatos, o grupo do registro será um número, e deverá então consultar a tabela grupos para ver qual o título.

Agora além de fazer uma única consulta já retornando o titulo do grupo ao invés do ID apenas, tem como ainda ordenar o resultado em ordem alfabética pelo nome do grupo? Pois o select "normal" apenas na tabela contatos, se ordenar pelo campo grupo vai ordenar pela ordem numérica, sendo que se 1=Trabalho e 2=Amigos já teremos um resultado não ordenado alfabeticamente.

Muito complicado??

Basta ordenar pelo nome do campo da outra tabela. :)

Naquele exemplo acima ficaria:

SELECT empresa.*, cidade.cidade FROM busca_empresas AS empresa LEFT JOIN busca_cidades AS cidade ON empresa.cidade = cidade.id_cidade WHERE empresa.id_empresa = $id ORDER BY cidade.cidade ASC
[]’s :DAté mais

#11 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 07/01/2008, 09:14

Ontem precisei fazer algo semelhante no meu sistema. Já havia feito em outra seção do site dividindo em duas consultas. Daí pensei: "Será que nã dá pra fazer numa só?"

Como nunca consegui aprender a user JOIN (eu devo ter alguma coisa contra elas mesmo) fiz assim:

$imovelUser = 'SELECT `ID` FROM `imoveis` WHERE `owner` = (SELECT `username` FROM `pusers` WHERE `ID` = \'' . $curUser . '\')';
Um SELECT dentro de um SELECT.

Funciona como o esperado. Mas qual o melhor modo? Assim, ou com JOIN? Pergunto isso não porque obrigatoriamente vou alterar nesse script. Mas talvez numa futura atualização seria interessante ago do tipo.

#12 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 07/01/2008, 09:33

Com JOIN você dá instruções mais adequadas ao otimizador do SGBD, isso facilita as coisas pra ele na hora de montar a pesquisa.
A não ser que você não se importe com performance, use JOIN.
O banco de dados agradece ;)




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq