Jump to content
Fórum Script Brasil
  • 0

Query MySQL para capturar dados de várias tabelas


mateusmoraes

Question

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?

Edited by mateusmoraes
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Oi, Mateus!

1) Existe alguma tabela de usuário?

2) Na Tabela 3 - "Comentarios" - Não há campo data. Como determinar a última data?

3) para uma melhor compreensão use o campo TIMESTAMP em lugar o campo data. Ele guarda a data e a hora o que facilita na hora de buscar os últimos acessos de um determinado usuário

Supondo que:

Você tenha substituido os campos data das tabelas Links_enviados e Votos;

Você tenha acrescentado um campo data_comentario (tipo timestamp) na tabela Comentarios;

Não haja uma tabela usuários (que seria a chave de ligação entre todas estas tabelas;

E que os atributos de identificadores dos usuarios das tabelas sejam do mesmo tipo;

Então a solução seria o uso de uma tabela temporaria.

estou assumindo que o tipo INTEGER UNSIGNED para identificadores dos usuarios das tabelas

Passo 1 Criando a tabela temporaria

CREATE TEMPORARY TABLE temp (
id_usuario INTEGER UNSIGNED NOT NULL,
DataHoraAcesso TIMESTAMP,
Acao VARCHAR(15),
id_acao INTEGER UNSIGNED NOT NULL,
OUTROS VARCHAR(15)
)ENGINE=MEMORY;
Passo 2 carregando dados
INSERT INTO temp (SELECT id_usuario, DataHoraAcesso, Acao, id_acao, outros)
SELECT id_quem_enviou, data_do_envio, "Links_enviados", id_link_enviado, ""
FROM Links_enviados WHERE id_quem_enviou='".$pega_a_id_do_usuario."'
ORDER BY data_do_envio DESC LIMIT 10
INSERT INTO temp (id_usuario, DataHoraAcesso, Acao, id_acao, outros)
SELECT id_quem_votou, data_do_voto, "Votos", id_voto, id_link, tipo_voto
FROM Votos WHERE id_quem_votou='".$pega_a_id_do_usuario."'
ORDER BY data_do_envio DESC LIMIT 10
INSERT INTO temp (id_usuario, DataHoraAcesso, Acao, id_acao, outros)
SELECT id_quem_comentou, data_comentario, Comentarios", id_comentario, id_link
FROM Comentarios WHERE id_quem_comentou='".$pega_a_id_do_usuario."'
ORDER BY data_do_envio DESC LIMIT 10
Passo 3 - A consulta
SELECT * 
FROM temp ORDER BY DataHoraAcesso DESC LIMIT 10
Passo 4 - Liberação de memória após uso
DROP TABLE temp

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...