在 Knex.js 中选择总和,而不使用 .raw

fns*_*jdb 7 mysql knex.js

我正在尝试在 Knex.js 中重写一些 MySQL 查询,我觉得我每次都会遇到这种情况.raw,这与我最初想要使用 Knex 的原因背道而驰。

是否可以在不使用 的情况下编写以下查询.raw

SELECT
   product,
   SUM(revenue)
FROM orders
Run Code Online (Sandbox Code Playgroud)

使用 raw,可以这样写:

knex()
   .select(
      'product',
      knex.raw('SUM(revenue)')
   )
   .from('orders')
Run Code Online (Sandbox Code Playgroud)

但使用 Knex 的想法是避免使用 MySQL 查询字符串,所以我希望有另一种方法。还是每个人都在.raw各处使用,而我误解了某些东西?很有可能,我是新手。

Luc*_*ros 10

您可以使用该sum方法。

\n\n
\n

sum \xe2\x80\x94 .sum(column|columns|raw) 检索给定列或列数组的值的总和(请注意,某些驱动程序不支持多列)。还接受原始表达式。

\n\n
knex(\'users\').sum(\'products\')\nOutputs:\nselect sum("products") from "users"\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

大概是这样的:

\n\n
knex()\n   .select(\'product\')\n   .sum(\'revenue\')\n   .from(\'orders\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

您应该根据您的具体情况进行调整。您可能需要使用类似的方法groupBy(\'product\')来获取每个产品的总收入。

\n\n

你真的应该仔细阅读 knex 的文档,它非常好而且直接,你绝对不应该一直使用 raw。

\n


kai*_*iak 7

您甚至可以指定返回总和列名称,如下所示:

knex(tableName)
 .select('product')
 .sum({ total: 'revenue' })
 .groupBy('product');
Run Code Online (Sandbox Code Playgroud)