[英]How can I join a table in MySQL, deriving one boolean result based on some criteria?
我有三個要加入MySQL的表。 為了簡單起見,我們將其稱為CUSTOMERS
, ORDERS
和NOTES
。 我的目標是創建一個查詢,該查詢在Windows應用程序中用於生成客戶列表,客戶所擁有的訂單數量 ,然后創建一個標志以指示人員是否寫了一些筆記。
在添加注釋要求之前,執行此操作的查詢是:
SELECT c.customer `Customer`, COUNT(o.id) `Order Qty`
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.customer ASC;
產生:
Customer Order Qty
-------- ---------
Acme Corp. 2
Bee Inc. 3
我想添加一個布爾值列以指示是否存在任何人工輸入的注釋。 (有自動生成的注釋,此查詢將忽略這些注釋。)
NOTES
表基本上是:
id int(3)
customer_id int(3)
note_datetime datetime
is_auto tinyint(1)
note text
任何客戶都可以具有任意數量的注釋(一對多關系),並且這些注釋可以自動生成( is_auto
為true),也可以不是。
我想添加一列,如果該客戶的任何注釋不是自動的,則僅返回true,讓用戶知道有人工輸入的注釋可供閱讀。
對於此示例,ACME(1)具有三個音符,其中之一不是自動的。 Bee(2)具有兩個自動注釋:
id customer_id is_auto
-- ----------- -------
1 1 1
2 1 1
3 1 0
4 2 1
5 2 1
我提出了以下查詢:
SELECT
c.customer `Customer`,
COUNT(o.id) `Order Qty`,
IF(SUM(IF(n.is_auto, 0, 1) > 0), TRUE, FALSE) `Human Notes`
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
LEFT JOIN notes n ON n.customer_id = c.id
GROUP BY c.customer ASC;
這將產生:
Customer Order Qty Human Notes
-------- --------- -----------
ACME Corp. 6 TRUE # (6 orders, should be 2)
Bee Inc. 6 FALSE # (6 orders, should be 1)
問題在於注釋表中的行會人為地增加訂單數量(2個訂單乘以3個注釋; 3個訂單乘以2個注釋)。 我知道這是因為LEFT JOIN創建了重復的訂單行,這些行與NOTES
表中的多行匹配。
我無法確定重寫此查詢的正確方法。 有什么更好的方法來加入notes表,以便獲得所需的布爾值,但又避免多余的行更改順序計數?
嘗試只使用exists
代替:
SELECT c.customer, COUNT(o.id) as `Order Qty`,
(CASE WHEN EXISTS (SELECT 1 FROM notes n WHERE n.customer_id = c.id and not n.is_auto)
THEN TRUE ELSE FALSE
END) as `Human Notes`
FROM customers c LEFT JOIN
orders o
ON o.customer_id = c.id
GROUP BY c.customer ASC;
否則,便箋的數量會弄亂訂單的數量-正如您所發現的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.