【问题标题】:pg-promise - Combine multiple nested loop queries to parent array resultpg-promise - 将多个嵌套循环查询组合到父数组结果
【发布时间】:2018-12-30 18:26:55
【问题描述】:

我的问题基于Combine nested loop queries to parent array result - pg-promise。我有一个类似的场景,但是要组合多个查询以获得我的最终结果。以下是我试图实现我的要求的代码。但是我无法从第二个查询与主查询结合获得结果。我是初学者,想知道正确的实现方式。

  db.task(t => {
    const a = studies => t.any ('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id).then(facility_contacts => {
    studies.facility_contacts = facility_contacts;
    return studies
      });
    const b = studies => t.any ('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id).then(eligibilities => {
    studies.eligibilities = eligibilities;
    return studies;
      });
  return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10',[], a, b).then(t.batch);
}).then(studies => {
  console.log(studies);
  res.send(studies);
}).catch(error => {
  console.log(error);
});

提前致谢。

【问题讨论】:

  • 您应该发布到目前为止您尝试过的代码,并说明哪个部分不起作用。简单地要求某人为您编写代码在 StackOverflow 社区中并不顺利。此外,问题标题在这种情况下毫无意义。
  • @vitaly-t 很抱歉给您带来不便。我已经添加了我的代码。

标签: node.js express pg-promise


【解决方案1】:

这是一种可能性:

db.task(t => {
    const a = studies => t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id)
        .then(facility_contacts => {
            studies.facility_contacts = facility_contacts;
            return studies
        });
    const b = studies => t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id)
        .then(eligibilities => {
            studies.eligibilities = eligibilities;
            return studies;
        });
    const c = studies => t.batch([a(studies), b(studies)]);
    return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], c)
        .then(t.batch);
})
    .then(studies => {
        console.log(studies);
        res.send(studies);
    })
    .catch(error => {
        console.log(error);
    });

可以有许多不同的方法,在某些方面表现更好,例如基于 JSON。

【讨论】:

    【解决方案2】:

    您可以使用 Promise.all 获取所有结果

    db.task(t => {
        const queries = [
            t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id),
            t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id),
            t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], a, b)
        ];
        return Promise.all(queries);
    }).then((ResultArrayOfQueries) => {
        console.log(ResultArrayOfQueries);
        // Combine as per your requirement
        res.send(ResultArrayOfQueries);
    }).catch(error => {
        console.log(error);
    });
    

    【讨论】:

    • 我收到与 study.nct_id 属性相关的错误
    • 永远不要在打开连接的上下文中使用Promise.all,正如pg-promise 解释的那样:github.com/vitaly-t/pg-promise/wiki/…
    • 此外,此代码甚至没有实现问题中解释的查询数据之间的任何依赖关系。
    猜你喜欢
    • 2018-10-27
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2016-11-18
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多