Sql Postgres knex查询连接列

Sql Postgres knex查询连接列,sql,node.js,database,postgresql,knex.js,Sql,Node.js,Database,Postgresql,Knex.js,我有一个Postgres DB,它将数据存储在一个表中,该表有以下列“date | uid | id | value | data” 在node.js服务器上使用,我当前从该查询中获得: data = await db(tableName).select(["date", "uid", "id", "value", "value as market_cap", "data"])

我有一个Postgres DB,它将数据存储在一个表中,该表有以下列“date | uid | id | value | data”

在node.js服务器上使用,我当前从该查询中获得:

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查询,则会获得额外的积分。谢谢大家!

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

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';

在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')

您可以通过在
date
上进行自联接并选择具有特定ID的行来实现这一点。Left join确保每个日期都有结果,即使它们缺少数据类型

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';

在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')

非常感谢。基于您的喜好,我在沙箱中运行了它:但是knex抛出了一个错误,声称id“market_cap”列不存在。查询中还缺少一个收盘“}”:@pspray我知道了,没有实际的市值列。它是虚拟的。我会找到答案的。将来,请确保提供您的模式。需要推断的人越少,你得到的答案就越好。谢谢,就可以了!我认为这是一个棘手的问题。查询解析为(选择“mv”、“date”、“mv”、“value”、“mc”、“value”作为“market\u cap”、“md”。“data”从“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“md”。“id”=“market”其中“mv”。“id”=“index”)。它不适用于双引号。还不知道如何用knex解决这个问题…@pspray明白了。Knex将假定join on子句是关于列的。让我们指定文字。谢谢!基于您的喜好,我在沙箱中运行了它:但是knex抛出了一个错误,声称id“market_cap”列不存在。查询中还缺少一个收盘“}”:@pspray我知道了,没有实际的市值列。它是虚拟的。我会找到答案的。将来,请确保提供您的模式。需要推断的人越少,你得到的答案就越好。谢谢,就可以了!我认为这是一个棘手的问题。查询解析为(选择“mv”、“date”、“mv”、“value”、“mc”、“value”作为“market\u cap”、“md”。“data”从“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“market\u snapshots”作为“mv”左侧加入“md”。“id”=“market”其中“mv”。“id”=“index”)。它不适用于双引号。还不知道如何用knex解决这个问题…@pspray明白了。Knex将假定join on子句是关于列的。让我们指定文本。