繁体   English   中英

MySQL 查询 - 来自多个表的 COUNT 的总和

[英]MySQL Query - SUM of COUNT from multiple tables

我有三张表:

  • 客户身份证,姓名
  • contract_jewelsid、customer_id、已支付、已转移、final_date
  • contract_objectsid、customer_id、支付、转移、final_date

如您所见,最后两个表的结构是相同的。 已付”和“已转移”字段包含值 0 或 1。

我需要做一个查询,该查询应该返回所有客户(无论他们是否有合同),并且对于每个客户: id, name, count_contracts_all , count_contracts_active

其中:

  • count_contracts_all表示 [SELECT COUNT( * ) FROM contract_jewels WHERE customer_id=3 (for example)] 和 [SELECT COUNT( * ) FROM contract_objects WHERE customer_id=3 (for example)] 的总和
  • count_contracts_active表示 [SELECT COUNT( * ) FROM contract_jewels WHERE customer_id=3 AND final_date>=Now() ANDpaid=0 AND transfer=0] 和 [SELECT COUNT( * ) FROM contract_objects WHERE customer_id=3 AND final_date> 的总和=Now() AND 支付=0 AND 转移=0]

有什么想法吗? 你能帮我吗? 谢谢!

您可以单独计算合同,然后将它们连接到客户:

SELECT
    c.id,
    COALESCE(oc.active_count,0) + COALESCE(jc.active_count,0) as count_contracts_active,
    COALESCE(oc.total_count,0) + COALESCE(jc.total_count,0) as count_contracts_all
FROM customers c
LEFT JOIN (
    SELECT
        customer_id
        COUNT(*) as total_count,
        COUNT(IF(final_date>=Now() AND paid=0 AND transferred=0,1,NULL)) as active_count
    FROM contracts_jewels
    GROUP BY customer_id
) as oc ON oc.customer_id = c.id
LEFT JOIN (
    SELECT
        customer_id
        COUNT(*) as total_count,
        COUNT(IF(final_date>=Now() AND paid=0 AND transferred=0,1,NULL)) as active_count
    FROM contracts_objects
    GROUP BY customer_id
) as jc ON jc.customer_id = c.id

我现在能想到的一种快速解决方案是:

SELECT COUNT(`temp_table`.*) FROM (
    SELECT * FROM contracts_jewels WHERE customer_id=3 UNION ALL
    SELECT * FROM contracts_objects WHERE customer_id=3) AS `temp_table`

SELECT COUNT(`temp_table`.*) FROM (
SELECT * FROM contracts_jewels WHERE customer_id=3 AND final_date>=Now() AND paid=0 AND transferred=0 UNION ALL
    SELECT * FROM contracts_objects WHERE customer_id=3 AND final_date>=Now() AND paid=0 AND transferred=0)  AS `temp_table`

您可以将这些表中的每一个加入两次并在结果中添加它们相应的COUNT

SELECT
    c.id,
    (COUNT(cj1.id)+COUNT(co1.id)) AS count_contracts_all,
    (COUNT(cj2.id)+COUNT(co2.id)) AS count_contracts_active
FROM
    customers c
    LEFT OUTER JOIN contracts_jewels cj1 ON c.id = cj1.customer_id
    LEFT OUTER JOIN contracts_objects co1 ON c.id = co1.customer_id
    LEFT OUTER JOIN contracts_jewels cj2 ON
        c.id = cj2.id AND
        cj2.final_date >= NOW() AND
        cj2.paid = 0 AND
        cj2.transferred = 0
    LEFT OUTER JOIN contracts_object co2 ON
        c.id = co2.id AND
        co2.final_date >= NOW() AND
        co2.paid = 0 AND
        co2.transferred = 0
GROUP BY c.id

注意:我还没有运行过这个,但希望它能让你朝着正确的方向前进。

简单的解决办法:

SELECT SUM(c) FROM (
    SELECT COUNT(1) as c FROM `tbl1` where ...
UNION
    SELECT COUNT(1) as c FROM tbl2 where ...
UNION
    SELECT COUNT(1) as c FROM tbl3 where ...
) al

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM