簡體   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