[英]Mysql how to return a test on children in one-to-many relationship
我有一個包含兩個表的數據庫:
categories
products
這是這兩個表之間的一對多關系,因此每個產品都可以通過“ category_id”列鏈接到一個並且只能鏈接到一個類別。
產品類別具有稱為“狀態”的列。
這是我的問題 :我想返回所有類別並將兩列附加到結果表中。
1)第一欄將計算類別中的產品數量。 (解決了)
2)第二列將計算產品數量。'status'=“ on sale”。
到目前為止,我的代碼(不起作用!):
SELECT a.*, COUNT(b.`category_id`) AS product_count, COUNT(c.`category_id`) AS status_count
FROM `categories` AS a
LEFT JOIN `products` AS b ON ( b.`category_id` = a.`id` )
LEFT JOIN `products` AS c ON ( c.`status` = 'on sale' AND c.`category_id` = a.`id`)
GROUP BY a.`id`
ORDER BY a.`name` ASC;
以下代碼僅返回產品計數列(有效!):
SELECT a.*, COUNT(b.`category_id`) AS equation_count
FROM `categories` AS a
LEFT JOIN `products` AS b ON ( b.`category_id` = a.`id` )
GROUP BY a.`id`
ORDER BY a.`name` ASC;
謝謝,尼古拉:)
不需要額外的JOIN
。 您可以使用CASE
表達式獲取每個類別的狀態為“正在銷售”的產品數量。 就像是:
SELECT
a.id,
a.name,
COUNT(b.`category_id`) AS product_count,
SUM(CASE WHEN b.status = 'on sale' THEN 1 ELSE 0 END) AS status_count
FROM `categories` AS a
LEFT JOIN `products` AS b ON b.`category_id` = a.`id`
GROUP BY a.`id`, a.name
ORDER BY a.`name` ASC;
由於您使用的是MySQL,因此可以使用SUM(b.status = 'on sale')
。 這是因為在MySQL中,布爾值隱式轉換為0和1,對於在product表中沒有條目的那些類別,使用IFNULL
將null
替換為0:
SELECT
a.id,
a.name,
COUNT(b.`category_id`) AS product_count,
IFNULL(SUM(b.status = 'on sale'), 0) AS status_count
FROM `categories` AS a
LEFT JOIN `products` AS b ON b.`category_id` = a.`id`
GROUP BY a.`id`, a.name
ORDER BY a.`name` ASC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.