【问题标题】:How to substract on sum() field from rows "grouped by"如何从“分组依据”的行中减去 sum() 字段
【发布时间】:2019-03-27 14:02:18
【问题描述】:

有下表

+------------------------+
| id | product_id | units|
+------------------------+
|  1 | 6949       |   3  |
|  2 | 6949       |   7  |
|  3 | 6912       |   0  |
|  . |   .        |   .  |
+------------------------+

我想计算有多少单位与产品 ID 相关联,因此我使用以下查询:

SELECT id, product_id, SUM(units) AS units FROM table GROUP BY product_id;

哪个会返回

+------------------------+
| id | product_id | units|
+------------------------+
|  1 | 6949       |   10 |
|  2 | 6912       |   0  |
+------------------------+

如何使用“更新”从任何使用其 product_id 的产品中减去 1 个单位?谢谢

【问题讨论】:

  • 该查询将返回语法错误。
  • UPDATE 用于实际更改表中的值。如果您想这样做,那么您需要具体说明要更改单位的哪一行。无法在 SUM 上更新
  • @isaace 这正是我想要实现的目标。只要 sum() 一致,我不介意哪一行受到影响

标签: mysql


【解决方案1】:

您的问题只是要求一个基本的GROUP BY 查询,这里是一个有效的查询:

SELECT
    product_id,
    SUM(units) AS units
FROM yourTable
GROUP BY
    product_id;

但是您的问题有一个转折点,因为示例结果集中出现的id 实际上似乎是一个行号,按每个产品组中的id 值之一排序。我们可以尝试编写这个查询:

SELECT
    ROW_NUMBER() OVER (ORDER BY MIN(id)) id,
    product_id,
    SUM(units) AS units
FROM yourTable
GROUP BY
    product_id;

Demo

【讨论】:

  • 感谢您的回答,但这不是我要问的
【解决方案2】:

试试

UPDATE table SET units = units - 1 WHERE product_id = ?

【讨论】:

  • 这会影响具有该 product_id 的所有行,而这正是我想要避免的。我只想从其中一行中减去 1
【解决方案3】:

查询的输出不反映表的内容,产品 6912 的 id 字段不能是 2,除非它是 @Tim 建议的 rownum。我猜这是一个错字,所以明确地使用结果表中的 id 让我们明确地选择我们想要的;

select min(id) min_id, product_id, sum(units) agg_units, sum(units) - 1 agg_units_minus_one from product group by product_id order by min_id;

+------+------------+-----------+---------------------+
| id   | product_id | agg_units | agg_units_minus_one |
+------+------------+-----------+---------------------+
|    1 |       6949 |        10 |                   9 |
|    3 |       6912 |         0 |                  -1 |
+------+------------+-----------+---------------------+

现在,如果您真的想要更新单位,我们至少有一个唯一的 id/product 组合可供使用和一个值分配,但我怀疑这不是您想要的(未来的聚合会出错)。

【讨论】:

  • 不错的方法,但不是我想要的,谢谢
【解决方案4】:

也许我忘了提醒我关心的是 sum() 结果,而不是每行的单位字段是否正确。我担心一个简单的更新会影响该 product_id 的所有行,所以查询会是

UPDATE table SET units = units - 1 WHERE product_id = 6949 LIMIT 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多