【发布时间】:2020-05-15 04:47:05
【问题描述】:
我正在使用 MySQL 5.6。我需要获得一个类别列表,其中包含一个产品count 列。到目前为止,这是一个非常简单和微不足道的任务。这里有点复杂:
- 产品有一个类别,也可以有一个子类别(可选)。
-
类别、子类别和产品可以处于活动状态 (
flg_public=1) 或禁用 (flg_public=NULL)。
因此,查询应返回满足这些要求的包含产品数量的类别列表:
- 如果某个类别被禁用,则它不得出现在列表中。
- 如果某个类别的子类别被禁用,则该子类别中的任何产品都不应计入相应类别的产品计数中。
这是我当前的查询:
SELECT store_cat.id_cat AS id_cat,
store_cat.name AS name,
COUNT(DISTINCT store_product.id_product) AS q
FROM store_cat
LEFT JOIN store_product
ON store_product.id_cat = store_cat.id_cat
AND store_product.flg_public = 1
LEFT JOIN store_subcat
ON store_product.id_subcat = store_subcat.id_subcat
AND store_subcat.flg_public = 1
WHERE store_cat.flg_public = 1
GROUP BY store_cat.id_cat
我添加了一个 sqlfiddle:http://sqlfiddle.com/#!9/43461b/1
在这个例子中:
- 子类别裤子属于类别衣服。
- 子类别 裤子
id_subcat=6已被flg_public=0禁用 -
裤子子类别只有 1 个处于活动状态的产品,但由于该子类别已被禁用,因此在
count查询中不应考虑这 1 个产品。 - 如您所见,有 4 个产品使用
id_cat=1,但其中一个产品是 Pantalon Flashid_product=47属于子类别 Pants @987654333 @ 已被禁用...但仍在考虑中...
衣服类别在金额列中返回 4...但它应该是 3。以下是结果应显示的内容(红色更改):
有什么想法吗?谢谢!
【问题讨论】:
-
1) 显示小提琴数据的所需结果 2) 指定 MySQl 版本。 3)在您的方案中,数据可能相互矛盾(产品可能直接引用一个子类别并通过类别引用另一个子类别) - 在这种情况下必须如何考虑产品?
-
@Akina 1) 我添加了带有红色校正的屏幕截图 /// 2) 我添加了 mysql 版本 (5.6)。 /// 3) products 可以选择有 id_cat 和 id_subcat... subcat 只能是所选类别的子类别(这在输入表单中控制,并没有为其他目的而特意规范化)。
-
请看我答案中的小提琴(尤其是中间非分组查询)。根据它 - 建立表
(store_product.flg_public, store_subcat.flg_public, 'matched or not')。 9 行 - 每个flg_public的 0、1、NULL 和匹配值。这将允许改进解决方案。
标签: mysql sql count left-join mysql-5.6