SQL多表关联查询问题:从3张钱包表获取目标提现记录
修正SQL查询以获取正确的提现记录
原表结构与数据
users表
userId User_name Wallet 1 Abdulrehmanahmad 1107.5 2 Azzhar789 1089 3 azharmehmood 1022 4 komalali 1252 5 Muhammadbasheer 800
wallet_transactions表(提现请求数据)
Transaction_id user_id Node_type amount type(in/out) date 1 3 withdrawal_wallet 1022 out 2022-07-22 2 2 withdrawal_wallet 1089 out 2022-07-22 3 4 withdrawal_wallet 400 out 2022-07-22 4 4 withdrawal_wallet 452 out 2022-07-22 5 4 withdrawal_wallet 400 out 2022-07-21
wallet_payment表(status=1为提现通过,-1为拒绝,0为待处理)
user_id amount time status 3 1022 2022-07-23 1 2 1089 2022-07-23 0 4 400 2022-07-23 -1 4 452 2022-07-23 1 4 400 2022-07-22 1
原SQL存在的问题
- JOIN条件不完整:仅通过
user_id关联wallet_transactions和wallet_payment,未匹配amount,导致不同金额的提现记录错误关联,返回结果金额混乱。 - 拼写错误:WHERE子句中
node_type的值写成withdraw_wallet,但表中实际是withdrawal_wallet,会过滤掉所有正确记录。 - 逻辑运算符错误:SQL中应使用标准的
AND而非&&(部分数据库支持&&但不属于通用写法)。 - 不必要的GROUP BY:需求是获取每条通过的提现明细,GROUP BY会导致数据聚合丢失有效记录,不符合预期。
- 缺少序号列与相对时间转换:未生成
sr序号列,且未将时间转换为"X hours ago"这类相对时间格式。
修正后的SQL语句
SELECT ROW_NUMBER() OVER(ORDER BY wp.time DESC) AS sr, u.User_name, wt.amount AS Latest_Withdrawal, CASE WHEN TIMESTAMPDIFF(HOUR, wp.time, NOW()) < 24 THEN CONCAT(TIMESTAMPDIFF(HOUR, wp.time, NOW()), ' hours ago') ELSE CONCAT(TIMESTAMPDIFF(DAY, wp.time, NOW()), ' day ago') END AS Time FROM users u INNER JOIN wallet_transactions wt ON u.userId = wt.user_id AND wt.Node_type = 'withdrawal_wallet' AND wt.`type(in/out)` = 'out' INNER JOIN wallet_payment wp ON wt.user_id = wp.user_id AND wt.amount = wp.amount AND wp.status = 1 ORDER BY wp.time DESC;
修正说明
- 完整JOIN条件:关联
wallet_transactions和wallet_payment时,同时匹配user_id和amount,确保提现请求与审核记录一一对应。 - 修正拼写与运算符:将
withdraw_wallet改为withdrawal_wallet,用标准AND替代&&。 - 生成序号列:用
ROW_NUMBER() OVER(ORDER BY wp.time DESC)生成自增的sr列。 - 相对时间转换:通过
TIMESTAMPDIFF函数计算当前时间与提现审核时间的差值,转换为需求中的相对时间格式(注:该写法基于MySQL,若使用其他数据库,需调整时间函数,如PostgreSQL用AGE())。 - 移除不必要的GROUP BY:直接按审核时间倒序排列,保留所有通过的提现明细。
内容的提问来源于stack exchange,提问作者murtaza ali
相关产品推荐
相关产品推荐

