首页 > 解决方案 > 在子查询中获取条件计数

问题描述

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

我可以使用子查询来执行此操作,但是我需要同时获取查询结果中的计数并按联接查询中的计数排序

  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_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

标签: mysqljoinsubquery

解决方案


你快到了。

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

COUNT(DISTINCT cm.contact_made_id) AS contact_count

但就相关而言,您不需要JOIN clients_coms,因为和表loan_id中都可用。删除此连接可避免重复,因此需要使用. 我还将您的条件更改为条件。contact_madeloansDISTINCTORloan_idIN

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 |

DB Fiddle 上的演示


推荐阅读