【问题标题】:select from 2 table based on count of 3rd table根据第 3 个表的计数从 2 个表中选择
【发布时间】:2017-01-31 12:07:03
【问题描述】:

我有 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

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

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

但我的总数是错误的。

【问题讨论】:

    标签: php mysql sql select inner-join


    【解决方案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 判断表是否有匹配项。

    【讨论】:

    • 抱歉回复晚了。我要检查你的答案,请稍候
    • 先生,它工作正常。你能解释一下你做了什么吗?和我知道的完全不一样
    • 先生,我不明白这一行,查询将如何检查每条收据记录? “当 rr.reimburse_id 不为 NULL 时的情况,则报销总额 ELSE 0 END”
    • 只有在收据表中存在该报销的记录时才会累加总数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多