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

INNER JOIN


Marcos Beraldo

Pergunta

ai pessoal... to com a seguinte duvida. Estou criando um chat. na tabela fica gravado assim... cod do usuario que enviou, codigo do usuario para o qual se destina a mensagem e a mensagem. Ok.

a idéia é fazer aparecer assim: Fulano falara para Ciclano:

Bom, eu tentei fazer assim: SELECT * FROM ead_chat_mensagem INNER JOIN usuarios ON ead_chat_mensagem.usuario_envio=usuarios.id

Dessa maneira ele pega o codigo de quem enviou (usuario_envio), vai na tabela usuarios pra saber o nome dele... até ai tudo bem, o problema é que eu tb preciso saber o nome do cara que foi destinada a mensagem, para isto bastaria substituir na select o 'usuario_envio' por 'usuario_destino'. Mas e pra pegar os dois simultaneamente???

Segue a estrutura completa da tabela: id usuario_destino usuario_envio mensagem data reservado ip

Obrigado!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
ai pessoal... to com a seguinte duvida. Estou criando um chat. na tabela fica gravado assim... cod do usuario que enviou, codigo do usuario para o qual se destina a mensagem e a mensagem. Ok.

a idéia é fazer aparecer assim: Fulano falara para Ciclano:

Bom, eu tentei fazer assim: SELECT * FROM ead_chat_mensagem INNER JOIN usuarios ON ead_chat_mensagem.usuario_envio=usuarios.id

Dessa maneira ele pega o codigo de quem enviou (usuario_envio), vai na tabela usuarios pra saber o nome dele... até ai tudo bem, o problema é que eu tb preciso saber o nome do cara que foi destinada a mensagem, para isto bastaria substituir na select o 'usuario_envio' por 'usuario_destino'. Mas e pra pegar os dois simultaneamente???

Segue a estrutura completa da tabela: id usuario_destino usuario_envio mensagem data reservado ip

Obrigado!

Hey Beraldo,

Você pode sempre encadear vários JOINs em uma única consulta, porém o ideal é que o seu SELECT principal seja feito na tabela que terá o menor número de registros. Faz um teste com a consulta abaixo:

select
	ecm.id,
	ecm.mensagem,
	ecm.data,
	ecm.reservado,
	ecm.ip,
	u1.nome "envio",
	u2.nome "destino"
from ead_chat_mensagem ecm
LEFT JOIN usuarios u1 ON u1.id = ecm.usuario_envio
LEFT JOIN usuarios u2 ON u2.id = ecm.usuario_destino
Porém, como não temos um WHERE para a consulta principal, o SELECT vai percorrer TODOS os registros da sua tabela ead_chat_mensagem e depois buscar os nomes na tabela de usuários. Como provavelmente o id na tabela de usuários é uma chave primária você terá apenas uma linha para analizar, mas se sua tabela de mensagens ficar muito grande é ALTAMENTE recomendável que você crie uma condição para o SELECT principal e crie um índice para essa condição:
mysql> select
    -> ecm.id,
    -> ecm.mensagem,
    -> ecm.data,
    -> ecm.reservado,
    -> ecm.ip,
    -> u1.nome "envio",
    -> u2.nome "destino"
    -> from
    -> ead_chat_mensagem ecm
    -> LEFT JOIN
    -> usuarios u1
    -> ON
    -> u1.id = ecm.usuario_envio
    -> LEFT JOIN
    -> usuarios u2
    -> ON
    -> u2.id = ecm.usuario_destino
    ->;
+----+----------+---------------------+-----------+-----------+---------+---------+
| id | mensagem | data                | reservado | ip        | envio   | destino |
+----+----------+---------------------+-----------+-----------+---------+---------+
|  1 | hey      | 2009-07-12 21:40:00 | N         | 127.0.0.1 | Neto    | Beraldo |
|  2 | teste    | 2009-07-12 21:40:00 | N         | 127.0.0.1 | Beraldo | Neto    |
+----+----------+---------------------+-----------+-----------+---------+---------+
2 rows in set (0.00 sec)
Como não temos um WHERE para o SELECT principal:
mysql> explain select ecm.id, ecm.mensagem, ecm.data, ecm.reservado, ecm.ip, u1.nome "envio", u2.nome "destino" from ead_chat_mensagem ecm LEFT JOIN usuarios u1 ON u1.id = ecm.usuario_envio LEFT JOIN usuarios u2 ON u2.id = ecm.usuario_destino;
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                      | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
|  1 | SIMPLE      | ecm   | ALL    | NULL          | NULL    | NULL    | NULL                     |    2 |       |
|  1 | SIMPLE      | u1    | eq_ref | PRIMARY       | PRIMARY | 3       | test.ecm.usuario_envio   |    1 |       |
|  1 | SIMPLE      | u2    | eq_ref | PRIMARY       | PRIMARY | 3       | test.ecm.usuario_destino |    1 |       |
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
3 rows in set (0.00 sec)
Adicionando um WHERE:
mysql> select ecm.id, ecm.mensagem, ecm.data, ecm.reservado, ecm.ip, u1.nome "envio", u2.nome "destino" from ead_chat_mensagem ecm LEFT JOIN usuarios u1 ON u1.id = ecm.usuario_envio LEFT JOIN usuarios u2 ON u2.id = ecm.usuario_destino WHERE ecm.usuario_envio = 1;
+----+----------+---------------------+-----------+-----------+---------+---------+
| id | mensagem | data                | reservado | ip        | envio   | destino |
+----+----------+---------------------+-----------+-----------+---------+---------+
|  2 | teste    | 2009-07-12 21:40:00 | N         | 127.0.0.1 | Beraldo | Neto    |
+----+----------+---------------------+-----------+-----------+---------+---------+
1 row in set (0.00 sec)
Resultado:
mysql> explain select ecm.id, ecm.mensagem, ecm.data, ecm.reservado, ecm.ip, u1.nome "envio", u2.nome "destino" from ead_chat_mensagem ecm LEFT JOIN usuarios u1 ON u1.id = ecm.usuario_envio LEFT JOIN usuarios u2 ON u2.id = ecm.usuario_destino WHERE ecm.usuario_envio = 1;
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                      | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
|  1 | SIMPLE      | ecm   | ref    | uenvio        | uenvio  | 3       | const                    |    1 |       |
|  1 | SIMPLE      | u1    | const  | PRIMARY       | PRIMARY | 3       | const                    |    1 |       |
|  1 | SIMPLE      | u2    | eq_ref | PRIMARY       | PRIMARY | 3       | test.ecm.usuario_destino |    1 |       |
+----+-------------+-------+--------+---------------+---------+---------+--------------------------+------+-------+
3 rows in set (0.00 sec)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...