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