0

Como fazer um select usando uma única tabela em duas (ou mais) linhas de JOINS?

criado por Jayme A. C. Gimenez em 26/08/2010 6:01pm
Certa vez fiz a seguinte pergunta no phorum ( http://phpbrasil.com/phorum/read.php?1,172847,172847#msg-172847 ):

--
"Fala galera!

Tem uma coisa que sempre acabo resolvendo de uma maneira ou de outra e sempre acabo evitando encarar uma dúvida com JOINs no SQL. É o seguinte:

Vamos supor que eu faça uma tabela (vendas) que tenha um campo "vendedor" e outro campo "comprador" (além de outros, que não interferem na dúvida que tenho). Quando faço insert, esses dois campos vão receber ids de uma única tabela, a tabela cadastro, por exemplo.

Eu consigo fazer um SELECT JOIN (uma única query, portanto) da tabela vendas, que me mostre resultados nos quais apareçam os nomes tanto do vendedor quanto do comprador? Já tentei fazer isso algumas vezes, mas o SQL sempre acusa erro..."
--

Depois de alguns esclarecimentos de minha parte, Marcos Regis escreveu:

--
"Bom, no caso específico você deve fazer uso dos Aliases para informar ao banco que você quer que ele trate uma tabela como unica para a instrução. É como se você transformasse a tabela cadastro em duas tabelas totalmente diferentes.
Ficando desta forma.

SELECT venda.*, vendedor.nome As vendedor, comprador.nome As comprador
FROM venda
INNER JOIN cadastro vendedor ON (venda.id_vendedor=vendedor.id)
INNER JOIN cadastro comprador ON (venda.id_comprador=comprador.id) " - Marcos Regis
--

Como essa era uma dúvida antiga, para a qual eu nunca havia encontrado uma boa resposta, resolvi (confesso que com certa desconfiança :-)) testar a resposta do Marcos Regis. E como deu certinho, resolvi transformar essa minha pergunta no phorum numa FAQ, dando os devidos créditos ao Marcos Regis (espero que ele considere que os créditos lhe estão devidamente dados - esse termo "dados" não parece o melhor, já que não estou dando nada a ele, pois os créditos já são, mesmo, dele! Mas não encontrei uma palavra mais adequada; então, vai essa mesma :-)).

Lista de Respostas:

0
26/08/2010 6:07pm
(~8 anos atrás)
Jayme A. C. Gimenez respondeu:
Como já citei no enunciado da FAQ, testei a solução apresentada pelo Marcos Regis e deu tudo perfeitamente certo! Para quem tiver curiosidade, vão abaixo o bd de teste que criei e o script que fiz usando o que o Marcos ensinou na resposta dele.


# phpMyAdmin MySQL-Dump
# version 2.3.2
# http://www.phpmyadmin.net/ (download page)
#
# Servidor: localhost
# Tempo de Generação: Ago 26, 2010 at 06:04 PM
# Versão do Servidor: 4.00.00
# Versão do PHP: 4.2.3
# Banco de Dados : `testes`
# --------------------------------------------------------

#
# Estrutura da tabela `aulas_particulares`
#

CREATE TABLE aulas_particulares (
aulas_particulares_id int(10) NOT NULL auto_increment,
aulas_particulares_professor_id int(1) NOT NULL default '0',
aulas_particulares_aluno_id int(1) NOT NULL default '0',
aulas_particulares_linguagem_id int(1) NOT NULL default '0',
aulas_particulares_obs text NOT NULL,
PRIMARY KEY (aulas_particulares_id),
KEY aulas_particulares_professor_id (aulas_particulares_professor_id),
KEY aulas_particulares_aluno_id (aulas_particulares_aluno_id),
KEY aulas_particulares_linguagem_id (aulas_particulares_linguagem_id),
FULLTEXT KEY aulas_particulares_obs (aulas_particulares_obs)
) TYPE=MyISAM COMMENT='Grade de aulas';

#
# Extraindo dados da tabela `aulas_particulares`
#

INSERT INTO aulas_particulares VALUES (1, 2, 3, 4, '');
INSERT INTO aulas_particulares VALUES (2, 2, 3, 3, '');
INSERT INTO aulas_particulares VALUES (3, 1, 2, 6, '');
INSERT INTO aulas_particulares VALUES (4, 1, 3, 6, '');
# --------------------------------------------------------

#
# Estrutura da tabela `contatos`
#

CREATE TABLE contatos (
contatos_id int(1) NOT NULL auto_increment,
contatos_nome varchar(100) NOT NULL default '',
contatos_email varchar(150) NOT NULL default '',
contatos_extra_1 varchar(30) NOT NULL default '',
contatos_extra_2 varchar(30) NOT NULL default '',
PRIMARY KEY (contatos_id)
) TYPE=MyISAM COMMENT='Contatos';

#
# Extraindo dados da tabela `contatos`
#

INSERT INTO contatos VALUES (1, 'Jayme Pato Quenquem', 'quenquem@pato.com.br', 'php e mysql', 'gambiarra##.net');
INSERT INTO contatos VALUES (2, 'Lobotoaldo Sabe Tudo', 'lobosemnocao@nasa.com', '357 linguagens de programação', 'computação quântica');
INSERT INTO contatos VALUES (3, 'Medialdo Levrotox', 'levrotox@uol.com.br', 'php, mysql, asp, javascript', 'gambiarra');
# --------------------------------------------------------

#
# Estrutura da tabela `linguagens`
#

CREATE TABLE linguagens (
linguagens_id int(1) NOT NULL auto_increment,
linguagens_nome varchar(50) NOT NULL default '',
linguagens_extra_1 varchar(30) NOT NULL default '',
linguagens_extra_2 varchar(30) NOT NULL default '',
linguagens_extra_3 varchar(30) NOT NULL default '',
PRIMARY KEY (linguagens_id)
) TYPE=MyISAM COMMENT='Linguagens';

#
# Extraindo dados da tabela `linguagens`
#

INSERT INTO linguagens VALUES (1, 'PHP', '', '', '');
INSERT INTO linguagens VALUES (2, 'ASP', '', '', '');
INSERT INTO linguagens VALUES (3, 'JAVA', '', '', '');
INSERT INTO linguagens VALUES (4, 'C', '', '', '');
INSERT INTO linguagens VALUES (5, 'Gambiarra', '', '', '');
INSERT INTO linguagens VALUES (6, 'Gambiarra##.net', '', '', '');



<?php
// Make a MySQL Connection
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("testes") or die(mysql_error());

$sql = mysql_query("SELECT aulas_particulares.*, professor.contatos_nome As professor,
professor.contatos_email As email_professor,
aluno.contatos_nome As aluno, aluno.contatos_email As email_aluno,
linguagens.linguagens_nome
FROM aulas_particulares
INNER JOIN contatos professor ON (aulas_particulares.aulas_particulares_professor_id=professor.contatos_id)
INNER JOIN contatos aluno ON (aulas_particulares.aulas_particulares_aluno_id=aluno.contatos_id)
INNER JOIN linguagens ON (aulas_particulares.aulas_particulares_linguagem_id=linguagens.linguagens_id)
")
or die(mysql_error());

echo "<table>
<tr><th>Linguagem</th>
<th>Nome do Professor</th>
<th>Email do professor</th>
<th>Nome do Aluno</th>
<th>Email do Aluno</th>
</tr>";

while ($row=mysql_fetch_array($sql)) {

echo "<tr><td>".$row['linguagens_nome']."</td>
<td>".$row['professor']."</td>
<td>".$row['email_professor']."</td>
<td>".$row['aluno']."</td>
<td>".$row['email_aluno']."</td></tr>";
}

echo "<table>";

?>

0
10/12/2015 6:59pm
(~2 anos atrás)
marcus kle respondeu:
Ola, poderia me ajudar?

gostaria de saber como faço essa relação entre tabelas conforme tabelas abaixo:

Usuarios
iduser, nome, telefon

Publicacoes
idpub, iduser, data, mensagem

amigos
ida, iduser, idamigo

a ideia é tipo: Usuario ter varios amigos, ter varios amigos, e o proprio usuario ter suas publicações e seus a igos também.
Como fazer para mostrar as publicações feitas por seus amigos em sua linha de tempo. COMO NO FACEBOOK.
Obs: eu fiz um INNE JOIN mais ele repete os registros.

SELECT *
FROM publicacoes
INNER JOIN amigos ON publicacoes.iduser = amigos.iduser
WHERE publicacoes.iduser =5

Grato..

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)