PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Combinez les requêtes de boucle imbriquées au résultat du tableau parent - pg-promise

Je suis l'auteur de pg-promise;)

con.task(t => {
    const a = post => t.any('SELECT * FROM comment WHERE idPost = $1', post.id)
        .then(comments => {
            post.comments = comments;
            return post;
        });
    return t.map('SELECT *, avatar FROM post, users WHERE user = $1 AND user = alias ORDER BY time DESC LIMIT 10 OFFSET $2', [username, pos], a)
        .then(t.batch);
})
    .then(posts => {
        res.send(posts);
    })
    .catch(error => {
        console.log(error);
    });

Voir également cette question :obtenir la table JOIN en tant que tableau de résultats avec PostgreSQL/NodeJS.

MISE À JOUR

Au cas où vous ne voudriez pas aller jusqu'au bout avec l'approche de requête JSON, alors ce qui suit évoluera beaucoup mieux que la solution d'origine, car nous concaténons toutes les requêtes enfants, puis les exécutons en une seule requête :

con.task(async t => {
    const posts = await t.any('SELECT *, avatar FROM post, users WHERE user = $1 AND user = alias ORDER BY time DESC LIMIT 10 OFFSET $2', [username, pos]);
    const a = post => ({query: 'SELECT * FROM comment WHERE idPost = ${id}', values: post});
    const queries = pgp.helpers.concat(posts.map(a));
    await t.multi(queries)
        .then(comments => {
            posts.forEach((p, index) => {
                p.comments = comments[index];
            });
        });
    return posts;
})
    .then(posts => {
        res.send(posts);
    })
    .catch(error => {
        console.log(error);
    });

Voir API :

  • helpers.concat
  • Database.multi