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

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存在的问题

  1. JOIN条件不完整:仅通过user_id关联wallet_transactions和wallet_payment,未匹配amount,导致不同金额的提现记录错误关联,返回结果金额混乱。
  2. 拼写错误:WHERE子句中node_type的值写成withdraw_wallet,但表中实际是withdrawal_wallet,会过滤掉所有正确记录。
  3. 逻辑运算符错误:SQL中应使用标准的AND而非&&(部分数据库支持&&但不属于通用写法)。
  4. 不必要的GROUP BY:需求是获取每条通过的提现明细,GROUP BY会导致数据聚合丢失有效记录,不符合预期。
  5. 缺少序号列与相对时间转换:未生成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;

修正说明

  1. 完整JOIN条件:关联wallet_transactions和wallet_payment时,同时匹配user_id和amount,确保提现请求与审核记录一一对应。
  2. 修正拼写与运算符:将withdraw_wallet改为withdrawal_wallet,用标准AND替代&&。
  3. 生成序号列:用ROW_NUMBER() OVER(ORDER BY wp.time DESC)生成自增的sr列。
  4. 相对时间转换:通过TIMESTAMPDIFF函数计算当前时间与提现审核时间的差值,转换为需求中的相对时间格式(注:该写法基于MySQL,若使用其他数据库,需调整时间函数,如PostgreSQL用AGE())。
  5. 移除不必要的GROUP BY:直接按审核时间倒序排列,保留所有通过的提现明细。

内容的提问来源于stack exchange,提问作者murtaza ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:54:25