簡體   English   中英

MySQL如何返回一對多關系中的孩子的測試

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

SQL小提琴演示


由於您使用的是MySQL,因此可以使用SUM(b.status = 'on sale') 這是因為在MySQL中,布爾值隱式轉換為0和1,對於在product表中沒有條目的那些類別,使用IFNULLnull替換為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;

更新了SQL Fiddle演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM