[英]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.