You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Eloquent按列分组求和多行并更新数据

解决MySQL中每日重复支付记录的金额合并与更新问题

看起来你需要把同一商户、同一投资者在同一天的重复支付记录合并,将对应金额求和对吧?这在MySQL里可以通过分组汇总结合数据更新或新建表来实现,我给你分场景梳理下具体方案:

第一步:先验证汇总结果

先通过GROUP BY查询确认每个分组的总金额,确保逻辑符合预期:

SELECT 
    date, 
    merchant_id, 
    investor_id, 
    SUM(payment) AS total_payment
FROM 
    your_table_name -- 替换成你的实际表名
GROUP BY 
    date, merchant_id, investor_id;

注意:如果你的date字段是字符串格式(比如示例中的27/05/1989),建议先转换成DATE类型再分组,避免因格式问题导致分组错误:

SELECT 
    STR_TO_DATE(date, '%d/%m/%Y') AS formatted_date, 
    merchant_id, 
    investor_id, 
    SUM(payment) AS total_payment
FROM 
    your_table_name
GROUP BY 
    formatted_date, merchant_id, investor_id;

场景1:创建新表存储汇总数据(推荐,安全不影响原数据)

如果不想直接修改原表,推荐新建一个表来保存去重并求和后的结果,这样原数据依然保留:

-- 创建汇总表,保留每个分组的最小ID和总支付金额
CREATE TABLE aggregated_payments AS
SELECT 
    MIN(id) AS id, -- 可根据需求选择保留分组内的任意ID,比如最大ID
    date, 
    merchant_id, 
    investor_id, 
    SUM(payment) AS payment
FROM 
    your_table_name
GROUP BY 
    date, merchant_id, investor_id;

场景2:直接修改原表(删除重复行+更新金额)

如果需要直接在原表上处理,一定要先备份数据! 然后按以下步骤操作:

步骤1:更新保留记录的金额

先创建临时表存储分组汇总数据,再把总金额更新到每个分组的其中一条记录(这里选择保留ID最小的那条):

-- 创建临时表存储汇总数据
CREATE TEMPORARY TABLE temp_agg AS
SELECT 
    date, 
    merchant_id, 
    investor_id, 
    SUM(payment) AS total_payment
FROM 
    your_table_name
GROUP BY 
    date, merchant_id, investor_id;

-- 更新原表中保留记录的支付金额
UPDATE your_table_name t
JOIN temp_agg ta 
    ON t.date = ta.date 
    AND t.merchant_id = ta.merchant_id 
    AND t.investor_id = ta.investor_id
SET t.payment = ta.total_payment
WHERE t.id = (
    SELECT MIN(id) 
    FROM your_table_name 
    WHERE date = ta.date 
      AND merchant_id = ta.merchant_id 
      AND investor_id = ta.investor_id
);

步骤2:删除重复记录

删除每个分组中除了保留记录以外的重复行:

DELETE t1 FROM your_table_name t1
JOIN your_table_name t2 
    ON t1.date = t2.date 
    AND t1.merchant_id = t2.merchant_id 
    AND t1.investor_id = t2.investor_id
WHERE t1.id > t2.id; -- 保留ID较小的那条,若要保留大ID则改成t1.id < t2.id

额外优化:统一日期字段类型

如果你的日期字段是字符串类型,建议转换成DATE类型,后续操作更可靠:

-- 修改字段类型为DATE
ALTER TABLE your_table_name MODIFY COLUMN date DATE;
-- 将现有字符串日期转换为DATE格式
UPDATE your_table_name SET date = STR_TO_DATE(date, '%d/%m/%Y');

内容的提问来源于stack exchange,提问作者Fasil kk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:17:20