Consulta sql duvida

Pessoal, estou com a seguinte dúvida no meu projeto para um trabalho de faculdade: eu preciso, em uma rota especifica, mostrar os dados do usuario, que consiste basicamente do seus dados pessoais e os posts que ele realizou. O problema é que não estou conseguindo pegar suas informações pessoais e seus posts em uma consulta sql e mostrar tudo isso em uma unica pagina. Segue o que fiz:

tabela

CREATE TABLE `claudioBlog`.`users` ( 
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
  `username` VARCHAR(250) NOT NULL , 
  `email` VARCHAR(250) NOT NULL , 
  `discription` VARCHAR (250),
  `ocupation` VARCHAR (250),
  `profile_image` VARCHAR (250)
  `password` VARCHAR(255) NOT NULL , 
  PRIMARY KEY (`id`), UNIQUE (`email`)
  );
  
 CREATE TABLE posts (
  id int(100) NOT NULL AUTO_INCREMENT,
  title VARCHAR(250)  NOT NULL,
  category VARCHAR(250)  NOT NULL,
  body VARCHAR(250)  NOT NULL,
  writer_username VARCHAR(250)  NOT NULL,
  post_img VARCHAR(250),
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 ) ;

username foi adicionado como UNIQUE posteriormente

rota/funcao/sql

router.get('/writer/:name', logginRequired, storyController.writerStories)

writerStories: (req, res) => {
        const name = req.params.name
        pool.getConnection((err, connection) => {
            connection.query('SELECT P.* FROM users U JOIN posts P on P.writer_username = U.username WHERE U.username=?',[name], (err, rows) => {
                connection.release()
                if(err) {
                    res.status(500).send(err)
                } else {
                    const row = rows
                    //row esta retornando []
                    res.render('writer', { data: row })
                }
            })
        })
    }

Eu preciso que fique como na foto abaixo, sendo que ao invés do formulário à direita irá aparecer os posts do usuário.

Confirmou se a consulta SQL retorna alguma coisa, rodando-a diretamente no banco? Esse seria o primeiro passo.

De toda forma, em vez de tentar buscar tudo em um mesmo select, eu recomendo usar duas consultas, uma para os dados do usuário, outra para os posts, unindo os resultados antes de usá-los.

Abraço.

Sim, utilizando a consulta que está na pergunta eu consigo recuperar as informações do post realizado pelo usuário, realizando a consulta direto no phpmyadmin. Mas a questão é que além disso, eu quero tbm as informações do próprio usuário para poder colocar na pagina com sua foto de perfil e etc, só que não estou sabendo fazer isso.

Olhando melhor, seus select só está selecionando da tabela posts (P.* ). Algum motivo pra isso? Se quer os dados do usuário junto, você precisa selecionar da users também (U.*):

SELECT U.*, P.* FROM users U JOIN posts P on P.writer_username = U.username WHERE U.username=?

Minha sugestão é fazer uma consulta pra buscar os dados do usuário, e outra para buscar os posts. Mais fácil ainda se você separar em duas funções, cada uma fazendo uma parte. Seria algo como:

router.get('/writer/:name', logginRequired, storyController.writerStories)

getUserData: (connection, name) => {
  connection.query('SELECT P.* FROM users U WHERE U.username=?',[name], (err, rows) => {
      if(err) { return [];} 
      else {
         return rows;  
      }
  }
}

getPosts: (connection, name) {
  connection.query('SELECT P.* posts P WHERE U.writer_username =?',[name], (err, rows) => {
         if(err) { return [];} 
      else {
         return rows;  
      }
   }
}

writerStories: (req, res) => {
        const name = req.params.name
        pool.getConnection((err, connection) => {
           getUserData(connection, name).then(function(userData){
              getPosts(connection, name).then(function(posts){
                 res.render('writer', { data: [userData: userData, posts: posts]})
              });
           }).finally( function() => {connection.release()});
        })
    }

Obs: fiz de cabeça só pra exemplificar, a sintaxe provavelmente precisa de ajustes.

Abraço.

1 curtida

Essa consulta resolveu meu “problema”, foi mais um erro de atenção da minha parte. Muito obrigado. Abraço.