Mysql 如何使用同一个表中的SUM()和COUNT()将表更新为不同的列

Mysql 如何使用同一个表中的SUM()和COUNT()将表更新为不同的列,mysql,sql,Mysql,Sql,我目前不这样做,我的网页显示数据表,现在需要更长的时间来加载网页,因为越来越多的数据进入数据库,使查询耗时。在我的头脑中,我希望更新一个表,如下所示,这样我只是查询表,而不是通过SELECT函数在内容上运行额外的心律失常。我计划在while循环中运行类似的东西,以循环用户变量的所有迭代 UPDATE table SET total = SUM(sales) SET orders = COUNT(order) GROUP by user WHERE user=$id 您可以使用join将其表示为

我目前不这样做,我的网页显示数据表,现在需要更长的时间来加载网页,因为越来越多的数据进入数据库,使查询耗时。在我的头脑中,我希望更新一个表,如下所示,这样我只是查询表,而不是通过SELECT函数在内容上运行额外的心律失常。我计划在while循环中运行类似的东西,以循环用户变量的所有迭代

UPDATE table
SET total = SUM(sales)
SET orders = COUNT(order)
GROUP by user
WHERE user=$id

您可以使用join将其表示为单个更新查询:

也就是说,这种方法没有真正意义。首先,我想问你是否真的需要这种方法。您的SQL非常糟糕,因此我猜您没有尝试优化您正在使用的实际查询。如果您对此感兴趣,请询问另一个问题,包括示例数据、所需结果和您使用的查询


在这种情况下,提高性能的正常方法是使用一个单独的表,每个用户一行,每个汇总统计数据一列。您可以使用触发器维护此表(用于更新、删除和插入),以便数据始终是最新的。

您可以使用join将其表示为单个更新查询:

也就是说,这种方法没有真正意义。首先,我想问你是否真的需要这种方法。您的SQL非常糟糕,因此我猜您没有尝试优化您正在使用的实际查询。如果您对此感兴趣,请询问另一个问题,包括示例数据、所需结果和您使用的查询


在这种情况下,提高性能的正常方法是使用一个单独的表,每个用户一行,每个汇总统计数据一列。您可以使用触发器维护此表(用于更新、删除和插入),以便数据始终是最新的。

尝试使用左联接总和+计数表中的更新值

update T T1
  left join (
    select `user`,sum(`sales`) newtotal,count(`order`) neworders
    from T
    group by `user`
  ) T2 on T1.`user` = T2.`user`
set T1.total = T2.newtotal,T1.orders = T2.neworders
测试DDL:

结果:


尝试使用左联接总和+计数表中的更新值

update T T1
  left join (
    select `user`,sum(`sales`) newtotal,count(`order`) neworders
    from T
    group by `user`
  ) T2 on T1.`user` = T2.`user`
set T1.total = T2.newtotal,T1.orders = T2.neworders
测试DDL:

结果:


我相信你们都为我回答了这个问题,我感谢你们,因为我一定会关注这个问题。这似乎是一个更快和自动化的选择。好吧,研究触发器多一点。。。如果在表1中添加了一个新的userID,触发器如何知道在表2中插入一个具有新userID的新行呢?虽然我相信你们都为我回答了这个问题,但我感谢你们,因为我肯定会关注触发器。这似乎是一个更快和自动化的选择。好吧,研究触发器多一点。。。如果在表1中添加了一个新的userID,触发器如何知道在表2中插入一个具有新userID的新行?
CREATE TABLE T
    (`user` varchar(4), `sales` int, `order` varchar(7), `total` int, `orders` int)
;

INSERT INTO T
    (`user`, `sales`, `order`, `total`, `orders`)
VALUES
    ('xx01', 100, 'order01', 0, 0),
    ('xx02', 200, 'order02', 0, 0),
    ('xx02', 400, 'order03', 0, 0),
    ('xx03', 300, 'order04', 0, 0),
    ('xx03', 500, 'order05', 0, 0)
;
| user | sales |   order | total | orders |
|------|-------|---------|-------|--------|
| xx01 |   100 | order01 |   100 |      1 |
| xx02 |   200 | order02 |   600 |      2 |
| xx02 |   400 | order03 |   600 |      2 |
| xx03 |   300 | order04 |   800 |      2 |
| xx03 |   500 | order05 |   800 |      2 |