我目前不为我的网页执行此操作以显示表中的数据,并且由于越来越多的数据进入数据库而使查询耗时,现在加载页面需要花费更长的时间。在我的头上,我希望按照以下方式更新表,以便仅查询表,而不会通过SELECT函数对内容运行其他心律不齐。我打算在while循环中运行类似的操作,以循环user
变量的所有迭代。
UPDATE table
SET total = SUM(sales)
SET orders = COUNT(order)
GROUP by user
WHERE user=$id
答案 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 |
答案 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非常糟糕,所以我猜您还没有尝试优化正在使用的实际查询。如果有兴趣,请提出另一个问题,并提供示例数据,所需结果和您正在使用的查询。
在这种情况下,提高性能的通常方法是要有一个单独的表,其中每个用户一行,每个汇总统计信息一列。您将使用触发器来维护该表-对于update
,delete
和insert
来说-这样数据始终是最新的。