【问题标题】:Postgres knex query joining columnsPostgres knex 查询连接列
【发布时间】:2021-02-20 06:56:42
【问题描述】:

我有一个 Postgres 数据库,它将数据存储在一个表中,该表具有以下列“日期 | uid | id | 值 | 数据”。

在我目前从这个查询中得到的 node.js 服务器上使用 knex

data = await db(tableName).select(["date", "uid", "id", "value", "value as market_cap", "data"]).whereIn("id", ["index", "market_cap", "market"]);

以下结果:

"data": [
{
  "date": "2020-11-07T21:43:11.709Z",
  "uid": "nmvdqy0kh87sd8a",
  "id": "index",
  "value": "999.9999999999999",
  "market_cap": "999.9999999999999",
  "data": null
},
{
  "date": "2020-11-07T21:43:11.709Z",
  "uid": "nmvdqy0kh87sd8b",
  "id": "market_cap",
  "value": "10125616413",
  "market_cap": "10125616413",
  "data": null
},
{
  "date": "2020-11-07T21:43:11.709Z",
  "uid": "nmvdqy0kh87sd8c",
  "id": "market",
  "value": null,
  "market_cap": null,
  "data": {
    "1": [],
    "2": []
  }
},
...

];

日期对都完全相同。存储在 id "market_cap" 下的数据实际上存储为 "value",存储在 id "market" 下的数据实际上存储为 "data"。

现在,我真正需要的是:

"data": [
{
  "date": "2020-11-07T21:43:11.709Z",
  "value": "999.9999999999999",
  "market_cap": "10125616413",
  "data": {
    "1": [],
    "2": []
  }
},
...

];

有没有办法直接从数据库中获取这个数据结构,而不是在服务器上转换数据?如果您提供 knex 查询/SQL 查询,则可以加分。谢谢!

【问题讨论】:

    标签: sql node.js database postgresql knex.js


    【解决方案1】:

    您可以通过 date 上的自联接并选择具有特定 ID 的行来完成此操作。左连接确保每个日期的结果,即使它们缺少数据类型。

    select mv."date", mv.value, mc.value as market_cap, md.data
    from market_snapshots mv
    left join market_snapshots mc on mv."date" = mc."date" and mc.id = 'market_cap'
    left join market_snapshots md on mv."date" = md."date" and md.id = 'market'
    where mv.id = 'index';
    

    Try it.

    在 Knex 中,它会类似于...

    knex.select(['mv.date', 'mv.value', 'mc.value as market_cap', 'md.data'])
      .from({ mv: 'market_snapshots' })
      .leftJoin({ mc: 'market_snapshots' }, function() {
        this.on('mv.date', '=', 'mc.date').andOn(knex.raw('mc.id = ?', 'market_cap'))
      })
      .leftJoin({ md: 'market_snapshots' }, function() {
        this.on('mv.date', '=', 'md.date').andOn(knex.raw('md.id = ?', 'market'))
      })
      .where('mv.id', 'index')
    

    【讨论】:

    • 谢谢!我根据您所做的那样在沙箱中工作:link 但是 knex 抛出一个错误,声称 id "market_cap" 列不存在。查询中还缺少一个结束“}”:-)
    • @pspray 我明白了,没有实际的 market_cap 列。是虚拟的。我会修复答案。将来,请务必提供您的架构。需要推断的人越少,你就会得到更好的答案。
    • 谢谢,会的!我认为这是一个knex问题。查询解析为 (select "mv"."date", "mv"."value", "mc"."value" as "market_cap", "md"."data" from "market_snapshots" as "mv" left在“mv”上将“market_snapshots”作为“mc”加入。“date”=“mc”。“date”和“mc”。“id”=“market_cap”在“mv”上将“market_snapshots”作为“md”加入。 "date" = "md"."date" 和 "md"."id" = "market" 其中 "mv"."id" = "index")。它不适用于双引号。还不知道如何用 knex 解决这个问题......
    • @pspray 知道了。 Knex 将假设 join on 子句是关于列的。 knex.raw 让我们指定文字。
    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2020-07-14
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多