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

时间:2018-07-12 02:14:12

标签: mysql sql mysqli

我目前不为我的网页执行此操作以显示表中的数据,并且由于越来越多的数据进入数据库而使查询耗时,现在加载页面需要花费更长的时间。在我的头上,我希望按照以下方式更新表,以便仅查询表,而不会通过SELECT函数对内容运行其他心律不齐。我打算在while循环中运行类似的操作,以循环user变量的所有迭代。

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

2 个答案:

答案 0 :(得分:4)

尝试使用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 |

TEST DEMO LINK

答案 1 :(得分:3)

您可以使用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非常糟糕,所以我猜您还没有尝试优化正在使用的实际查询。如果有兴趣,请提出另一个问题,并提供示例数据,所需结果和您正在使用的查询。

在这种情况下,提高性能的通常方法是要有一个单独的表,其中每个用户一行,每个汇总统计信息一列。您将使用触发器来维护该表-对于updatedeleteinsert来说-这样数据始终是最新的。