从不同表中扣除两个字段的Mysql查询
我想实现一个查询,结果是学生(基于搜索)的总金额余额从评估表减去付款表从不同表中扣除两个字段的Mysql查询,mysql,Mysql,我想实现一个查询,结果是学生(基于搜索)的总金额余额从评估表减去付款表 学生姓名-花费(评估)-支付(付款)-总余额 表1:学生 id,firstname,lastname,middlename,idno Sample Data 1, a, a, a, 18001 2, b, b, b, 18002 表2:评估 id、学生id、金额 Sample Data 1, 1, 500 2, 1, 600 3, 2, 100 4, 2, 100 Sample Data 1, 1, 200 2, 1
学生姓名-花费(评估)-支付(付款)-总余额
表1:学生 id,firstname,lastname,middlename,idno
Sample Data
1, a, a, a, 18001
2, b, b, b, 18002
表2:评估
id、学生id、金额
Sample Data
1, 1, 500
2, 1, 600
3, 2, 100
4, 2, 100
Sample Data
1, 1, 200
2, 1, 100
表3:支付
id、学生id、金额
Sample Data
1, 1, 500
2, 1, 600
3, 2, 100
4, 2, 100
Sample Data
1, 1, 200
2, 1, 100
结果必须是:
student, assessment, payment, balance
a, 1100, 200, 900
b, 200, 100, 100
这是我现在的查询。。。并没有给出我预期的结果
$qry = "SELECT c.*, SUM(CASE WHEN x.type = 'assessment' THEN x.amount ELSE 0 END) spent
, SUM(CASE WHEN x.type = 'payments' THEN x.amount ELSE 0 END) paid
, SUM(CASE WHEN x.type = 'assessment' THEN x.amount ELSE x.amount * -1 END) total
FROM students c
LEFT JOIN
( SELECT studentid
, 'assessment' type
, amount
FROM assessment
UNION
SELECT studentid
, 'payments'
, amount
FROM payment
) x
ON x.studentid = c.id
WHERE ((c.firstname like '%$search%' or c.lastname like '%$search%' or c.middlename like '%$search%' or c.idno like '%$search%') and c.status = 1)
GROUP
BY c.id;";
为每个学生在单独的子子句中执行每个表中的金额总和,然后将这些子句与主查询连接起来
SELECT c.*,
COALESCE(a.amount,0) assessment,
COALESCE(p.amount,0) payment,
COALESCE(a.amount,0) - COALESCE(p.amount,0) balance
FROM students c
LEFT JOIN (SELECT studentid, SUM(amount) amount
FROM assessment
GROUP BY studentid
) a ON c.id = a.studentid
LEFT JOIN(SELECT studentid, SUM(amount) amount
FROM payment
GROUP BY studentid
) p ON c.id = p.studentid
WHERE ((c.firstname like '%$search%'
OR c.lastname like '%$search%'
OR c.middlename like '%$search%'
OR c.idno like '%$search%')
AND c.status = 1)
谢谢你,蒂姆,我刚刚用示例表和数据更新了第一篇文章。学生2没有付款记录,在你的预期输出中,你是如何将付款显示为100的?