如何将同一个表中的sum()和count()更新为不同的列

ux6nzvsh  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(355)

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

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

qjp7pelc1#

你可以把它表示为一个单独的 update 查询使用 join :

UPDATE t JOIN
       (SELECT user, SUM(sales) as toal, COUNT(order) as orders
        FROM t
        GROUP BY user
       ) tt
       ON t.user = tt.user
    SET t.total = tt.total,
        t.orders = tt.orders;

也就是说,这种方法没有真正意义。首先,我想问你是否真的需要这种方法。您的sql非常糟糕,所以我猜您没有尝试优化您正在使用的实际查询。如果您对此感兴趣,可以问另一个问题,包括示例数据、所需结果和您使用的查询。
在这种情况下,提高性能的正常方法是使用一个单独的表,每个用户一行,每个汇总的统计信息一列。您可以使用触发器来维护这个表 update 是的, delete s、 以及 insert 所以数据总是最新的。

bbuxkriu

bbuxkriu2#

尝试使用来自的更新值 left join (总和+计数)表

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:

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 |

测试演示链接

相关问题