繁体   English   中英

如何在MySQL中联接表,根据某些条件得出一个布尔结果?

[英]How can I join a table in MySQL, deriving one boolean result based on some criteria?

我有三个要加入MySQL的表。 为了简单起见,我们将其称为CUSTOMERSORDERSNOTES 我的目标是创建一个查询,该查询在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.

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