簡體   English   中英

MySQL查詢僅在行存在時返回值

[英]MySQL query only returns value if rows exist

我有以下查詢,它可以完美運行,但前提是每個選擇都找到一行。

我嘗試添加IFNULL以返回0(如果未找到任何行),但仍無法獲得正確的返回值。

SELECT IFNULL(paid_value,0)-IFNULL(ordered_value,0)+IFNULL(credit_value,0) AS account_balance
            FROM
            (
              SELECT customer_id, SUM(order_total) AS ordered_value
              FROM orders
              WHERE customer_id = '1'
              GROUP BY customer_id
            ) AS orders
            LEFT JOIN
            (
              SELECT customer_id, SUM(amount) AS paid_value
              FROM transactions
              WHERE customer_id = '1'
              GROUP BY customer_id
            ) as payments
            ON orders.customer_id = payments.customer_id
            LEFT JOIN
            (
                SELECT customer_id, SUM(amount) AS credit_value
                FROM credits
                WHERE customer_id = '1'
                GROUP BY customer_id
            ) as credits
            ON orders.customer_id = credits.customer_id

該查詢當前返回空,不返回NULL或0。

當我跑步

              SELECT customer_id, SUM(order_total) AS ordered_value
              FROM orders
              WHERE customer_id = '1'
              GROUP BY customer_id

除非有一行,它還會返回空值,而不是NULL或0。 為了使完整查詢正常工作,三個獨立查詢中的每一個都需要在其中包含一行。

有任何想法嗎?

如果因為沒有一個列都沒有結果集,那么返回一個空結果集,如果您想始終在任何情況下都顯示一行,則可以嘗試使用以下技巧:

SELECT IFNULL(SUM(payments.paid_value),0)-IFNULL(SUM(orders .ordered_value),0)+IFNULL(SUM(credits.credit_value),0) AS account_balance
FROM 
(SELECT 1 AS idx, 0 AS paid_value, 0 AS ordered_value, 0 AS credit_value) a
LEFT JOIN
            (
              SELECT 1 AS idx, customer_id, SUM(order_total) AS ordered_value
              FROM orders
              WHERE customer_id = '1'
              GROUP BY customer_id
            ) AS orders
            ON a.idx = orders.idx 
            LEFT JOIN
            (
              SELECT customer_id, SUM(amount) AS paid_value
              FROM transactions
              WHERE customer_id = '1'
              GROUP BY customer_id
            ) as payments
            ON orders.customer_id = payments.customer_id
            LEFT JOIN
            (
                SELECT customer_id, SUM(amount) AS credit_value
                FROM credits
                WHERE customer_id = '1'
                GROUP BY customer_id
            ) as credits
            ON orders.customer_id = credits.customer_id
            GROUP BY a.idx

該示例是一種概念證明,甚至可以用於需要始終返回具有默認值的行(即使基礎表中沒有元素)的其他情況。

如果您想在沒有可用數據的情況下進行行事件,那么我想您應該擁有UNION 或者,在這種情況下,您可以包括客戶表,並將每個表放在右側,進行LEFT JOIN

我認為遵循選擇將為您提供一個理想的選擇。

SELECT O.customer_id, SUM(O.order_total) AS ordered_value
              FROM Customers C
              left join orders O on C.ID =o.customer_id
              WHERE O.customer_id = '1'
              GROUP BY O.customer_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM