Ir para conteúdo

POWERED BY:

Arquivado

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

mateusvmoraes

[Resolvido] Query MySQL para capturar dados de várias tabelas

Recommended Posts

------- MOVER TÓPICO -------

Pensei que estivesse no Fórum "Banco de dados » MySQL".

Moderador, poderia mover para lá, por favor? ;)

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

 

 

Estou quebrando a cabeça para escrever uma query mySQL para buscar alguns registros do banco de dados a partir de 3 tabelas diferentes.

 

Basicamente, o que quero é listar as 10 últimas ações de um determinado usuário. Essas ações podem ser:

- envio de um link;

- voto em um link;

- comentário sobre um link.

 

Tabelas e campos que preciso pegar:

 

Tabela 1 - "Links_enviados":

[id_link_enviado] - [id_quem_enviou] - [data_do_envio]

 

Tabela 2 - "Votos":

[id_voto] - [id_link] - [tipo_voto] - [id_quem_votou] - [data_do_voto]

 

Obs: [tipo_voto] só pode ser "+1" ou "-1"

 

 

Tabela 3 - "Comentarios":

[id_comentario] - [id_link] - [id_quem_comentou]

 

 

Rascunhei o código abaixo, mas não chegou nem perto de funcionar:

 

@$pega_a_id_do_usuario="123" //Esta variável pega a ID do usuário para usar na query

SELECT *
FROM Links_enviados
INNER JOIN Votos
(ON id_quem_votou='".$pega_a_id_do_usuario."')
INNER JOIN Comentarios
(ON id_quem_comentou = '".$pega_a_id_do_usuario."')
INNER JOIN Comentarios as comentarios2
(ON comentarios2.id_link = Links_enviados.id_link_enviado)
WHERE
Links_enviados.id_quem_enviou='".$pega_a_id_do_usuario."'
LIMIT 10

Alguma idéia do que devo fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

da pra você postar a extrutura completa das tabelas, ou é so aquilo msm?!

 

pq o uso de ('".$pega_a_id_do_usuario."') se aparentemente você naum esta colocando isso dentro de uma variavel?

 

PS: Ja avisei o Beraldo (moderador) pra mover o seu post para a area de MySQL... em breve ele movera seu post

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Movido: PHP => MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

da pra você postar a extrutura completa das tabelas, ou é so aquilo msm?!

 

pq o uso de ('".$pega_a_id_do_usuario."') se aparentemente você naum esta colocando isso dentro de uma variavel?

 

PS: Ja avisei o Beraldo (moderador) pra mover o seu post para a area de MySQL... em breve ele movera seu post

abraços

A estrutura das tabelas é um pouco mais complexa. É a estrutura do Wordpress. Só coloquei aqui as colunas que quero buscar e exibir na tela.

 

"$pega_a_id_do_usuario" está sendo usado no inicio do código para capturar a ID do usuário. A partir daí eu utilizaria esse valor na query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi das tabelas o comentario usa a data da tabela de links, caso você tenha esquecido de colocar data_comentario ou algo parecido avisa q eu refaço o sql.

 

O IS NULL la no final serve pra q um comentario nao seja interpretado como envio de link, ja q pelo q eu entendi o comentario eh um envio de link

 

 

Select * from

(

Select

comentarios.id_link as link , 'comentario' as acao , links_enviados.data_envio as dia

from

links_enviados , comentarios

where

comentarios.id_link = link_enviados.id_link_enviado AND

comentarios.id_quem_comentou = '$usuario'

order by links_enviados.data_envio desc

Limit 10

 

UNION ALL

 

Select

votos.id_link as link , 'voto' as acao , data_voto as dia

from

links_enviados , votos

where

votos.id_link = link_enviados.id_link_enviado AND

votos.id_quem_votou = '$usuario'

order by votos.data_voto desc

Limit 10

 

UNION ALL

 

Select

links_enviados.id_link_enviado as link , 'envio de link' as acao , links_enviados.data_do_envio as dia

from links_enviados

LEFT JOIN comentarios ON comentarios.id_link = link_enviados.id_link_enviado

where comentarios.id_link IS NULL AND

id_quem_enviou = '$usuario'

order by links_enviados.data_envio desc

Limit 10

)as abc

Order by abc.dia desc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muitissimo obrigado, giesta! Ainda não testei, mas parece perfeito.

 

Pelo que eu entendi das tabelas o comentario usa a data da tabela de links, caso você tenha esquecido de colocar data_comentario ou algo parecido avisa q eu refaço o sql.

Tem razão, me esqueci de citar a coluna "data_comentario". Portanto, a Tabela 3 - "Comentarios" é composta por:

[id_comentario] - [id_link] - [id_quem_comentou] - [data_comentario]

 

Acredito que a mudança deva ser apenas essa, correto?

...
Select
comentarios.id_link as link , 'comentario' as acao , links_enviados.data_envio as dia
...
order by COMENTARIOS.DATA_COMENTARIO desc
Limit 10

O IS NULL la no final serve pra q um comentario nao seja interpretado como envio de link, ja q pelo q eu entendi o comentario eh um envio de link

Na verdade, o comentário não é um envio de link. É meramente uma mensagem relacionado a um link enviado.

 

Exemplo:

LINK PARA O FORUM IMASTERS (enviado por geista)

1 comentário sobre este link

mateusvmoraes comentou: "este forum é muito bom" (23/02/2008 - 22:00) <- esse é o comentário

 

Então acho que é só remover a instrução abaixo, estou certo?

comentarios.id_link IS NULL AND

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao... Na verdade nesse caso nao precisa nem de 10% do circo q eu fiz

 

basta você pegar a data , a acao e o id do link das 3 tabelas , juntar tudo com UNION pra ficarem 30 linhas e dessas 30 você pega as 10 com maior data , nada de join ou outras macacadas

 

De qualquer forma eu acho q você pegou o espirito da coisa e daqui pra frente pode dar continuidade ao seu projeto :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao... Na verdade nesse caso nao precisa nem de 10% do circo q eu fiz

 

basta você pegar a data , a acao e o id do link das 3 tabelas , juntar tudo com UNION pra ficarem 30 linhas e dessas 30 você pega as 10 com maior data , nada de join ou outras macacadas

 

De qualquer forma eu acho q você pegou o espirito da coisa e daqui pra frente pode dar continuidade ao seu projeto :)

giesta, Graças à sua ajuda consegui resolver este projeto. Tive que fazer umas adaptações, mas seu "empurrãozinho" foi essencial.

 

Muito obrigado de novo! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

PS: te mandei uma MP. Depois me responde, beleza?

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.