【问题标题】:Getting count with conditions in sub query在子查询中获取条件计数
【发布时间】:2019-01-27 01:22:06
【问题描述】:

我有 4 张桌子,如下所示。对于 'status_loan_id' = 33 或 43 的记录,我需要从 contact_made 表中获取 contact_made_id 的计数

我可以使用子查询来做到这一点,但是我需要同时获取查询结果中的计数和按计数排序在连接查询中

  1. 贷款
    loan_id | Client_id
    ---------------------
    9727    |   12668
    9780    |   12720
    9781    |   12721
    9782    |   12722
    9783    |   12723
    9784    |   12724
    9785    |   12725
  1. 客户
    Client_id
    ---------------------
    12668
    12720
    12721
    12722
    12723
    12724
    12725
  1. clients_coms
    client_coms_id |   client_id
    -----------------------------
    2114           |   12668 
    2115           |   12668 
    2116           |   12668 
    2117           |   12668  
    2121           |   12668 
    2122           |   12668  
    2260           |   12720 
    2261           |   12720  
    2262           |   12720  
    2263           |   12721  
    2264           |   12721  
    2265           |   12721  
    2266           |   12722  
    2267           |   12722  
    2268           |   12723 
    2269           |   12723  
    2270           |   12723  
    2271           |   12723  
    2272           |   12724  
    2273           |   12724 
    2274           |   12724  
    2275           |   12724 
    2276           |   12725 
    2277           |   12725  
    2278           |   12725  
  1. contact_made
    contact_made_id | loan_id | status_loan_id
    1               | 9727    | 3  
    2               | 9727    | 3  
    3               | 9727    | 34   
    4               | 9727    | 33  
    5               | 9727    | 3 
    6               | 9727    | 33 
    9               | 9727    | 3 
    0               | 9727    | 3 
    11              | 9782    | 33 
    12              | 9782    | 3 
    13              | 9782    | 33 
    14              | 9782    | 3 
    15              | 9782    | 34 

我有下面的 SQL,但是它给出了以下不正确的输出

SELECT 
l.loan_id, 
COUNT(cm.contact_made_id) AS contact_count
FROM loans l
LEFT JOIN contact_made cm 
          ON l.loan_id = cm.loan_id 
          AND (cm.status_loan_id = 33 OR cm.status_loan_id = 34)
LEFT JOIN clients_coms com 
          ON l.client_id = com.client_id
GROUP BY l.loan_id
ORDER BY contact_count ASC

输出...

loan_id | contact_count     
------------------------
9780    | 0
9781    | 0
9783    | 0
9784    | 0
9785    | 0
9782    | 6
9727    | 18

应该输出...

loan_id | contact_count     
------------------------
9780    | 0
9781    | 0
9783    | 0
9784    | 0
9785    | 0
9782    | 2
9727    | 3

【问题讨论】:

    标签: mysql join subquery


    【解决方案1】:

    你快到了。

    为避免重复,您可以简单地使用COUNT(DISTINCT...),例如:

    COUNT(DISTINCT cm.contact_made_id) AS contact_count
    

    但就问题而言,您不需要JOIN clients_coms,因为loan_idcontact_madeloans 表中都可用。删除此连接可避免重复,因此需要使用 DISTINCT。我还将loan_id 上的OR 条件更改为IN 条件。

    SELECT l.loan_id, COUNT(cm.loan_id) contact_count
    FROM 
        loans l 
        LEFT JOIN contact_made cm 
            ON l.loan_id = cm.loan_id 
            AND cm.status_loan_id IN (33, 34)
    GROUP BY loan_id
    ORDER BY 2, 1;
    

    产量:

    |贷款ID |联系计数 | | -------- | ------------- | | 9780 | 0 | | 9781 | 0 | | 9783 | 0 | | 9784 | 0 | | 9785 | 0 | | 9727 | 3 | | 9782 | 3 |

    Demo on DB Fiddle.

    【讨论】:

    • 谢谢。这正是它所需要的。顺便说一句,加入 cleints_coms 是出于另一个原因,我认为应该将其保留在问题中。
    【解决方案2】:

    你能在 where 条件下运行它吗?

    SELECT 
    l.loan_id, 
    COUNT(cm.contact_made_id) AS contact_count
    FROM loans l
    LEFT JOIN contact_made cm 
              ON l.loan_id = cm.loan_id 
    LEFT JOIN clients_coms com 
              ON l.client_id = com.client_id
    WHERE cm.status_loan_id in (33, 34)
    GROUP BY l.loan_id
    ORDER BY contact_count ASC
    

    如果没有,请尝试使用 Inner Join+Where 条件

    【讨论】:

    • 在 WHERE 中添加它仅输出具有该条件的行。我需要所有的loan_id
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2014-04-09
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多