sql >> Database teknologi >  >> RDS >> PostgreSQL

Kombiner indlejrede loop-forespørgsler til overordnet matrixresultat - pg-promise

Jeg er forfatter til 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);
    });

Se også dette spørgsmål:få JOIN-tabel som en række resultater med PostgreSQL/NodeJS.

OPDATERING

Hvis du ikke ønsker at gå hele vejen med JSON-forespørgselstilgangen, vil følgende skalere meget bedre end den oprindelige løsning, da vi sammenkæder alle underordnede forespørgsler og derefter udfører dem som én forespørgsel:

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);
    });

Se API:

  • helpers.concat
  • Database.multi


  1. hvordan man implementerer tabelarv i GreenDao

  2. Brug af en visning uden primær nøgle med Entity

  3. Sådan forankres/ophæves forespørgsel til Windows og andre faner i SQL Server Management Studio ( SSMS) - SQL Server / TSQL vejledning del 21

  4. Julen kommer tidligt (Oracle 12.2)