【问题标题】:Select a sum in Knex.js without using .raw在不使用 .raw 的情况下在 Knex.js 中选择一个总和
【发布时间】:2020-11-02 21:09:58
【问题描述】:

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

是否可以使用.raw编写以下查询?

SELECT
   product,
   SUM(revenue)
FROM orders

使用raw,它可以写:

knex()
   .select(
      'product',
      knex.raw('SUM(revenue)')
   )
   .from('orders')

但使用 Knex 的想法是避免使用 MySQL 查询字符串,所以我希望有另一种方法。还是每个人都只是在任何地方使用.raw,而我误解了什么?很有可能,我是新手。

【问题讨论】:

  • 当您使用强制转换或 SQL 函数编写查询时,您需要经常使用 knex.raw。使用它没有什么不好,但你应该使用?? 标识符绑定来引用这样的列/表:knex.raw('SUM(??)', ['revenue']) :)
  • 这种方法的优势是什么?只是更短的 sql 字符串?
  • 它会根据使用的 sql 方言自动为标识符添加正确的引号。

标签: mysql knex.js


【解决方案1】:

您可以使用sum 方法。

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

knex('users').sum('products')
Outputs:
select sum("products") from "users"

大概是这样的:

knex()
   .select('product')
   .sum('revenue')
   .from('orders')

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

你真的应该去看看 knex 的 documentation,它非常好而且很直接,你绝对不应该一直使用 raw。

【讨论】:

  • 啊,是的,这样就行了!我确实在文档中看到了sum,但在我的脑海中,总和在选择内,我不知道如何实现这一点。谢谢!
【解决方案2】:

您甚至可以像这样指定返回的总和列名称:

knex(tableName)
 .select('product')
 .sum({ total: 'revenue' })
 .groupBy('product');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多