Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pedro Roccon

MySQL/PHP - Relacionamento de tabelas

Recommended Posts

Galera, bom dia.

Primeiramente obrigado à todos pelo suporte que vocês oferecem aqui na Fórum. Bom, vamos lá, estou com 1 dúvida.

 

Tenho 2 tabelas, uma delas é a tabela 'recados' e a outra é uma tabela de 'pessoas'. As pessoas podem mandar recados umas para as outras. Cada pessoa tem um id que é armazenado na tabela 'recados'. A tabela recados recebe 2 IDs, o id da pessoa que enviou e o ID da pessoa que recebeu.

 

Minha dúvida é, quando executo uma consulta, como eu relaciono a tabela com o nome das pessoas? Se eu der 1 SELECT apenas na tabela eu consigo somente o ID das pessoas.

 

Tenho uma consulta já feita, porém ela me retorna apenas o nome da pessoa que enviou o comentário, eu precisaria das duas, a que enviou e a que recebeu.

SELECT pessoas.*, recados.* FROM pessoas INNER JOIN recados ON pessoas.id = recados.id_remetente ORDER BY recados.id

Desde já agradeço, muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara posso estar errado, mas acho que nesse caso você deveria rever a modelagem, deixa-la N:N (Many To Many, Muitos para Muitos).



Porque assim, você tem uma pessoa, essa pessoa tanto pode criar um comentário quanto responder, certo? E você tem as respostas das pessoas, então no caso penso que seja necessário uma tabela intermediária, do tipo pessoa_resposta, onde ela teria o id da resposta, o id da pessoa, algo assim



---

 

Pô cara então, na mesma SQL que não consegui (dá um desconto to no trampo rs), mas com duas SQL eu consegui da seguinte forma:

CREATE TABLE pessoa (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	nome VARCHAR(50) NOT NULL
)ENGINE=INNODB;

CREATE TABLE recado (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	recado TEXT NOT NULL,
	pessoa_id INT NOT NULL,
	FOREIGN KEY (pessoa_id) REFERENCES pessoa (id)
)ENGINE=INNODB;

CREATE TABLE pessoa_recado_resposta (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	pessoa_enviou_id INT NOT NULL,
	pessoa_recebeu_id INT NOT NULL,
	recado_id INT NOT NULL,
	FOREIGN KEY (pessoa_enviou_id) REFERENCES pessoa (id),
	FOREIGN KEY (pessoa_recebeu_id) REFERENCES pessoa (id),
	FOREIGN KEY (recado_id) REFERENCES recado (id)
)ENGINE=INNODB;

SELECT pessoa.nome, recado.* FROM recado
INNER JOIN pessoa ON pessoa.id = recado.pessoa_id

SELECT pessoa.nome FROM pessoa_recado_resposta
INNER JOIN recado ON recado.id = pessoa_recado_resposta.recado_id
INNER JOIN pessoa ON pessoa.id = pessoa_recado_resposta.pessoa_recebeu_id

 

Acho que dá pra simpliciar, deve dá, mas o caminho é esse!

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio, sempre que eu tiver uma modelagem N:N vou ter que ter uma tabela intermediária? Eu queria fazer de um jeito mais fácil se tivesse solução. Vou listrar melhor

 

Tabela Pessoa
______________________________________

| id | nome |

| 1 | João |

| 2 | Márcia |

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

 

Tabela Comentários

_________________________________________________________________

 

| id | id_remetente | id_destinatario | comentario |

| 1 | 2 | 1 | Olá, mensagem de teste |

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

 

Gostaria de em apenas uma consulta relacionar o id_remetente na tabela comentários com o id da pessoa na tabela pessoa. Sei que consigo fazer isso com INNER JOIN, porém eu consigo apenas o id_remetente. Gostaria que minha consulta retornasse:

 

_________________________________________________________________

| id | nome_remetente | nome_destinatario | comentario |

| 1 | Márcia | João | Olá, mensagem de teste |

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

 

Acho que agora ficou mais claro de entender :)

 

Obrigado pela resposta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

De acordo com suas duas tabelas eu consegui fazer o seguinte:

 

SELECT 	p.*, 
		r.recado, 
		(SELECT p.nome FROM pessoa AS p INNER JOIN recado AS r ON r.id_recebeu = p.id) AS nome_recebeu
FROM pessoa AS p
INNER JOIN recado AS r ON r.id_enviou = p.id

 

Não sei como fica em relação a performance nesse caso, mas funciona rs. A galera mais experiente pode te dar um toque.

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer N relacionamentos com a tabela pessoa, não é necessário subselects.

 

SELECT
    R.nome AS remetente,
    C.comentario,
    D.nome AS destinatario
FROM
    pessoa R
    INNER JOIN comentario C ON (C.id_remetente = R.id)
    INNER JOIN pessoa D ON (D.id = C.id_destinatario)

A única restrição dos joins, é que as tabelas sejam incluídas conforme os dados forem mostrados. Na verdade, é uma convenção, assim como indentação, comandos SQL em upper case. Já ouvi dizer que é mais performático, mas deve ser irrelevante.

 

Como pode ver, eu mostro primeiro remetente, recado e então o destinatário. Como a ordem não afeta o uso dos dados no software, fica a seu critério.

 

Basta você adicionar os dados necessários da sua consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você pode fazer N relacionamentos com a tabela pessoa, não é necessário subselects.

 

SELECT
    R.nome AS remetente,
    C.comentario,
    D.nome AS destinatario
FROM
    pessoa R
    INNER JOIN comentario C ON (C.id_remetente = R.id)
    INNER JOIN pessoa D ON (D.id = C.id_destinatario)

A única restrição dos joins, é que as tabelas sejam incluídas conforme os dados forem mostrados. Na verdade, é uma convenção, assim como indentação, comandos SQL em upper case. Já ouvi dizer que é mais performático, mas deve ser irrelevante.

 

Como pode ver, eu mostro primeiro remetente, recado e então o destinatário. Como a ordem não afeta o uso dos dados no software, fica a seu critério.

 

Basta você adicionar os dados necessários da sua consulta.

 

Cara muito boa a sua solução, dessa dos JOIN's eu não sabia!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.