根据第3表的计数从2表中选择

时间:2017-01-31 12:07:03

标签: php mysql sql select inner-join

我有3张桌子。会员报销和收据。我想显示会员的名字,有收据的报销总额。例如

构件

member_id   member_name
1           luffy
2           zoro
3           nami

报销

reimburse_id member_id reimburse_total
1            1         5000
2            2         10000
3            3         10000

收据

receipt_id  reimburse_id reimburse_price reimburse_no
1            1           2500            2012232
2            1           2500            2012123
3            2           5000            2012454
4            2           5000            2012565

我想显示有收据的会员的所有报销。在这种情况下,select查询应该像这样返回

name   No. of reimburse total
luffy         1         5000 
zoro          1         10000
nami          0         0

到目前为止,我得到了什么

SELECT member.member_name,
       COU­NT(distinct reimbursement.reimbu­rse_id) as nor,
       SUM(distinct reimbursement.reimbu­rse_total)
FROM member INNER JOIN
     reimbursement 
     ON member.member_id = reim­bursement.member_id INNER JOIN
     receipt
     ON reimbursement.reimbu­rse_id=receipt.reimb­urse_id
GROUP BY member.memberID

但是总得错了。

1 个答案:

答案 0 :(得分:1)

嗯。这有点奇怪,因为您只使用receipt来确定是否应该使用这些值。一种方法是LEFT JOIN和一些条件逻辑:

SELECT m.member_name,
       COUNT(rr.reimburse_id) as nor,
       SUM(CASE WHEN rr.reimburse_id IS NOT NULL THEN reimburse_total ELSE 0 END) as reimbu­rse_total
FROM member m LEFT JOIN
     reimbursement r
     ON m.member_id = r.member_id LEFT JOIN
     (SELECT DISTINCT rr.reimburse_id
      FROM receipt rr
     ) rr
     ON r.reimbu­rse_id = rr.reimb­urse_id
GROUP BY m.memberID, m.member_name;

此查询背后的逻辑是仅使用receipt表来确定是否有可用的报销。 select distinct删除重复项。然后left joincase确定表格是否匹配。