sql >> データベース >  >> RDS >> PostgreSQL

ネストされたループクエリを親配列の結果に結合します-pg-promise

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

    この質問も参照してください:PostgreSQL/NodeJSを使用して結果の配列としてJOINテーブルを取得します。

    更新

    JSONクエリのアプローチを完全に使いたくない場合は、すべての子クエリを連結して1つのクエリとして実行するため、以下は元のソリューションよりもはるかに優れたスケーリングになります。

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

    APIを参照してください:

    • helpers.concat
    • Database.multi


    1. SQLServerの依存関係

    2. MicrosoftAccessのレポートウィザードを使用してレポートを作成する方法

    3. 外部キー制約で使用される列を変更できません

    4. SQLServerで自動インクリメント主キーを定義する方法