问题描述
嘿,我想减少我的桌子并更新自己(对一些列进行分组和求和,并删除行)
源表“ table_test”:
+----+-----+-------+----------------+
| id | qty | user | isNeedGrouping |
+----+-----+-------+----------------+
| 1 | 2 | userA | 1 | <- row to group + user A
| 2 | 3 | userB | 0 |
| 3 | 5 | userA | 0 |
| 4 | 30 | userA | 1 | <- row to group + user A
| 5 | 8 | userA | 1 | <- row to group + user A
| 6 | 6 | userA | 0 |
+----+-----+-------+----------------+
想要的表:(获得者)
DROP TABLE table_test_grouped;
SET @increment = 2;
CREATE TABLE table_test_grouped
SELECT id,SUM(qty) AS qty,user,isNeedGrouping
FROM table_test
GROUP BY user,IF(isNeedGrouping = 1,isNeedGrouping,@increment := @increment + 1);
SELECT * FROM table_test_grouped;
+----+------+-------+----------------+
| id | qty | user | isNeedGrouping |
+----+------+-------+----------------+
| 1 | 40 | userA | 1 | <- rows grouped + user A
| 3 | 5 | userA | 0 |
| 6 | 6 | userA | 0 |
| 2 | 3 | userB | 0 |
+----+------+-------+----------------+
问题:我可以使用另一个(临时)表,但是我想更新初始表:
这是一个最小的例子,我不希望从table_test_grouped中完全替换首字母,因为在我的情况下,我还有另一个专栏(isNeedGrouping)来决定是否分组。
对于标记为“ isNeedGrouping”的行,我需要分组。 对于此示例,一种方法是按顺序执行:
CREATE TABLE table_test_grouped SELECT id,isNeedGrouping FROM table_test WHERE isNeedGrouping = 1 GROUP BY user ;
DELETE FROM table_test WHERE isNeedGrouping = 1 ;
INSERT INTO table_test SELECT * FROM table_test_grouped ;
有什么简单的建议吗?
解决方法
清空并重新填充表格可能比尝试更新/删除更简单。另外,可以简化聚合逻辑,以避免使用用户变量。
您可以这样写:
create table table_test_tmp as
select min(id) id,sum(qty) qty,user,isneedgrouping
from table_test tt
group by tt.user,case when tt.isneedgrouping = 0 then tt.id end;
truncate table table_test; -- back it up first!
insert into table_test (id,qty,isneedgrouping)
select id,isneedgrouping
from table_test_tmp;
drop table table_test_tmp;