Jump to content


Photo

Pesquisa No Mysql - 2 Tabelas Ao Mesmo Tempo...


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

#1 jfsmi

jfsmi

    12 Horas

  • Usuários
  • 201 posts
  • Sexo:Masculino

Posted 26/09/2005, 16:22

Olá pessoal,

Tenho um Banco de Dados chamado GERAL.
Nele há:
- Tabela SECRETARIAS com ID e NOME
- Tabela DEPARTAMENTOS com ID, ID_SECRETARIA e NOME (reparem que nesta tabela não gravo o NOME da secretaria, mas apenas o ID dela).

Quero que, ao apresentar os NOMES dos departamentos numa pesquisa, apresente os NOMES das secretarias também, apesar de estar gravado apenas o ID_SECRETARIA em DEPARTAMENTOS.
Como deve ser meu script?

Espero q tenham conseguido entender minha dúvida...

Não sou expert... mas tento ajudar! Mas o que mais preciso é de ajuda! hehehe


#2 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 26/09/2005, 21:27

SELECT * FROM departamentos

LEFT JOIN secretarias

ON departamentos.id_secretaria = secretarias.id

WHERE departamentos.id = '$id'

LIMIT 1

PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#3 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 27/09/2005, 08:33

Veja se é assim:

<?

$SQL = "
SELECT dep.nome AS dp_nome, sec.nome AS sc_nome
FROM departamentos AS dep
    RIGHT JOIN secretarias AS sec
        ON dep.id_secretaria = sec.id
";

$rConsulta = mysql_query($SQL) or die(mysql_error());

$dp_nome_anterior = null;
while ($rs = mysql_fetch_assoc($rConsulta))
{   extract($rs);
    
    if ($dp_nome != $dp_nome_anterior)
        print "<h2>{$dp_nome}</h2>";
        
    print "- {$sc_nome}<br />";

    $dp_nome_anterior = $dp_nome;
}

?>


[]'s
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#4 jfsmi

jfsmi

    12 Horas

  • Usuários
  • 201 posts
  • Sexo:Masculino

Posted 27/09/2005, 10:05

Ae Goiaba,

Muito obrigado!!! Funcionou teu script... inclusive, consegui aprender mais deste recurso. Por exemplo, se eu quiser pesquisar de mais de duas tabelas.... é só tirar o LEFT e deixar apenas o JOIN.

Fiz um teste assim:
Tabela ALUNOS { ID, NOME }
Tabela CURSOS { ID, NOME }
Tabela NOTAS { ID_ALUNO, ID_CURSO, BIMESTRE, NOTA }

Usando o seguinte comando:

$sql = mysql_query("SELECT notas.*, alunos.nome AS nome_A, cursos.nome AS nome_C FROM notas JOIN alunos, cursos ON notas.id_aluno = alunos.id AND notas.id_curso = cursos.id");
while ($linha = mysql_fetch_array($sql)) {
$bimestre = $linha["bimestre"];
$nota = $linha["nota"];
$aluno_nome = $linha["nome_A"];
$curso_nome = $linha["nome_C"];
echo $aluno_nome . "|" . $curso_nome . "|" . $bimestre . "|" . $nota . "<br>";
}

Explicando o código:

$sql = mysql_query("
SELECT notas.*, // Seleciona todas as colunas da tabela NOTAS
alunos.nome AS nome_A, // Seleciona apenas a coluna NOME da tabela ALUNOS renomeando para NOME_A
cursos.nome AS nome_C //  Seleciona apenas a coluna NOME da tabela CURSOS renomeando para NOME_C
FROM notas // Tabela NOTAS é a base da pesquisa
JOIN alunos, cursos // As tabelas ALUNOS e CURSOS também serão pesquisadas
ON notas.id_aluno = alunos.id // seguindo estas diretrizes: ID_ALUNO na tabela notas deve ser igual à ID na tabela ALUNOS
AND notas.id_curso = cursos.id"); // E ID_CURSO na tabela NOTAS deve ser igual à ID na tabela CURSOS
while ($linha = mysql_fetch_array($sql)) { // Grava cada informação em $linha
$bimestre = $linha["bimestre"]; // para poder retirar nestas linhas...
$nota = $linha["nota"];
$aluno_nome = $linha["nome_A"];
$curso_nome = $linha["nome_C"];
echo $aluno_nome . "|" . $curso_nome . "|" . $bimestre . "|" . $nota . "<br>"; // e mostrá-las aki}


hehehe, espero que outros possam ser ajudados com estas explicações.


Valeu pessoal.

Não sou expert... mas tento ajudar! Mas o que mais preciso é de ajuda! hehehe


#5 Luisjustin

Luisjustin

    Turista

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

Posted 25/03/2012, 18:13

Muito útil eu estava tendo um problema por executar a pesquisa de forma errada, eu estava executando deste jeito:
mysql_query("SELECT server.serverid, server.ipid, server.name, server.status, server.port, ip.ipid ,ip.ip FROM server, ip WHERE ip.ipid=server.ipid, server.clientid=1");

mas o correto era:

mysql_query("SELECT * FROM server LEFT JOIN ip ON server.ipid = ip.ipid WHERE clientid='".$_SESSION['ID']."'");

#6 Squall Robert

Squall Robert

    Mr. Squall - Mais Carne do que Osso (hihi)

  • Usuários
  • 507 posts
  • Sexo:Masculino
  • Localidade:Curitiba
  • Interesses:Php ... Php...Php

Posted 26/03/2012, 10:45

Se você é iniciante em Bancos de Dados ou ainda tem dúvidas sobre a utilização de Joins entre tabelas, saiba que o procedimento é mais simples do que parece. Basta entender pra que serve cada tipo de join e como eles trabalham. Sua experiência e persistência se encarregarão de lhe ensinar qual utilizar nas situações do cotidiano.

Programas Utilizados
- Bancos de Dados (Firebird, Interbase, MySQL, etc.)
- Gerenciador de Bancos de Dados (IBExpert, IBOConsole, IBConsole, etc.)
- Tabelas abaixo
FILIAL
FIL_CODIGO FIL_NOME
1 MATRIZ
2 FILIAL 1
3 FILIAL 2

FUNCIONARIOS
FUN_CODIGO FIL_CODIGO FUN_NOME
1 1 JOÃO
2 2 JOAQUIM
3 2 JOSÉ
4 3 MÁRCIO
5 null PEDRO
Pequena História
Na verdade, utilizamos palavras em inglês, padronizadas pela ANSI (American National Standards Institute), originalmente criada pela IBM com o nome de SEQUEL (Structured English Query Language) e posteriormente abreviada para SQL, para efetuar consultas de dados a um banco de dados relacional. Mas o que vem a ser um Join? Esta palavra em inglês significa Unir ou União e a utilizamos quando precisamos buscar dados em outras tabelas desde que satisfaça as condições para isso.
Porém ainda paira a dúvida: utilizo Join, Inner Join, Left Join, Right Join ou me jogo do 14º Andar?
Esta história de direita e esquerda funciona em qualquer banco de dados relacional pois são padrões definidos para se manter a compatibilidade entre os bancos de dados. Imagine você como seria se para fazer uma busca no Firebird você tivesse de escrever:
SELECT * FROM FUNCIONARIOS
WHERE FIL_CODIGO = 1

E no DB2 fosse completamente diferente:
FROM FUNCIONARIOS WHERE FIL_CODIGO = 1 SELECT *

Isto certamente causaria um "Access Violation" em sua cabeça.
Vamos ao que interessa.

Entendendo LEFT, RIGHT e INNER
Quando dizemos que a tabela será Left ou Right, estamos informando ao comando SQL que ele deve obedecer o sentido para a Direita ou para a Esquerda, ou seja, ao utilizarmos Left Join o banco de dados irá analisar a estrutura da tabela da Direita e comparar com a tabela da Esquerda (leia-se Direita para a Esquerda), veja o desenho.


Left Join
Na primeira situação temos o Left Join, a seta está apontando para a tabela FUNCIONARIOS simbolizando que a precedência é da tabela da Esquerda, então podemos dizer que no select abaixo, serão listados todos os Funcionários, mesmo aqueles que não tem Filial cadastrada.
SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS A
LEFT JOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO

-- RESULTADO DA CONSULTA --
FUN_NOME FIL_NOME
JOÃO MATRIZ
JOAQUIM FILIAL 1
JOSÉ FILIAL 1
MÁRCIO FILIAL 2
PEDRO null
Repare que Pedro foi incluído no resultado, porém ele não possui uma Filial associada em seu cadastro. Este tipo de Join é o mais utilizado quando não se tem certeza que todos os registros possuem ligação entre as tabelas e também na maioria das vezes por questões de desempenho.
Right Join
Na segunda situação foi utilizado o Right Join, também conhecido apenas por Join, que aponta para a tabela FILIAL simbolizando a precedência da tabela da Direita, logo, concluímos que os dados da tabela Filial devem existir para que o registro seja trazido no Select.
SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS A
RIGHT JOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO
-- AINDA PODEMOS UTILIZAR SEM A PALAVRA RIGHT
/*
SELECT A.FUN_NOME, B.FIL_NOME FROM FUNCIONARIOS A
JOIN FILIAL B ON A.FIL_CODIGO = B.FIL_CODIGO
*/

-- RESULTADO DA CONSULTA --
FUN_NOME FIL_NOME
JOÃO MATRIZ
JOAQUIM FILIAL 1
JOSÉ FILIAL 1
MÁRCIO FILIAL 2
Note que o funcionário Pedro desta vez não foi incluído na lista de resultados, isto ocorreu porque esta consulta traz apenas registros onde existe um cadastro de Filial para o Funcionário.

Inner Join
Temos ainda a situação do Inner Join que nada mais faz do que observar se existem registros combinados em ambas as tabelas, ou seja, para que um registro seja incluído na lista de resultados, o campo de ligação entre duas tabelas deve satisfazer as condições em ambas. O resultado desta consulta seria algo muito semelhante ao Join.

Conclusão
Com algum conhecimento básico para interação entre tabelas, podemos efetuar consultas complexas ao banco de dados envolvendo resultados perfeitamente controlados. Isto garante não somente credibilidade em consultas mas também desempenho do sistema quando utilizado corretamente. Ainda existem outros tipos de Join, porém seus resultados são semelhantes ou seu uso é muito pouco frequente. Para quem quiser saber mais a respeito de consultas SQL, basta ler um livro de Banco de Dados (qualquer um que seja pois todos tem muito conteúdo sobre PL/SQL).
<?php

$squall = new Squall();

$squall->Ajudando("você");

$resultado = $squall->solucao();  ?>

#7 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 29/10/2017, 06:08

Purchase Doxycycline Online No Prescription Propecia Plm viagra online Zithromax Cause Acne Keflex 700 Mg
Cialis Suisse online pharmacy Levitra Quante Ore Dura Cialis Versus Levitra

#8 xapedlok

xapedlok

    Ativo

  • Usuários
  • 392 posts
  • Sexo:Feminino
  • Localidade:Bochum

Posted 29/10/2017, 08:09

Discounts! the best of makeup

progect13.jpg
Products which fall under this return policy can be returned domestically, as long as they are unused and in the original packaging. No questions asked!
If a product that falls under this guarantee is found to be counterfeit, you will get a full refund (shipping costs included).

buy.png

READ MORE
Rosa hair products malaysian afro kinky curly virgin hair,3 pcs malaysian curly human hair extension 8''-30'' afro kinky hair ( 69.19 $)
shop show интернет магазин официальный сайт
Teclast X98 Air III Tablet PC-134.02 $
MEIZU PRO 5 4G Phablet-426.88 $
Simplee 2016 autumn gold sequin embroidery elegant jumpsuit romper transparent mesh sleeve playsuit women deep v neck overalls ( 39.98 $)
играть энгри берс
момент затяжки болтов форд
Clearance! cotton floral print blouse long sleeve blusas femininas floral women blouses casual blusas y camisas mujer shirts ( 13.10 $)
Hdd 2tb sata 3.5 (2000g) 7200rpm sata hard disk drive for cctv dvr or computer pc with hight quality hdd ( 131.59 $)
Hot sale waterproof camping tent gazebo ice fishing tent awning sun shelter winter tent beach tent one hall and one room ( 102.60 $)
battlefield 1 ultimate купить
Excelvan CL720D LED Projector with Digital TV Slot ( 135.99 $)
усилие затяжки гбц
Stylish women's off the shoulder bell sleeve printed dress ( 20.55 $)
Graz dark brown suede loafer shoe wrubber sole ( 321.29 $) Moreschi


9bb.jpg

#9 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 29/10/2017, 08:48

Priligy Dapoxetina Precio Mexico Viagra Cialis Oder Levitra Gut order levitra Fludrocortisona 0.1 Mg Bentyl Amoxicillin Doses For How Long




0 user(s) are reading this topic

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

IPB Skin By Virteq