从包含类别和子类别的表中进行选择的sql查询

h9vpoimq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(389)

类别表的结构:
身份证件
标题
父项id
项目表的结构:
身份证件
标题
\u是否处于活动状态(0)или 1)
类别\u id
表结构
表通过一对多关系与category\u id字段相关联。那些。1个类别可以有多个项目。
类别表中的两级层次结构。这定义了主要类别和子类别。类别是那些父项id=null的记录。以及子类别,这些记录中的父项=某个id。
一个项目可以同时属于主类别(其中父类别id=null)和子类别(子类别)。项可以是活动项,也可以是非活动项(0或1)。
您需要进行一个查询,并从category表中选择所有主要类别(其父类的id=null),这些类别具有活动项(is\u active=1),并且其子类别也具有活动项。i、 e如果子类别中的项处于活动状态,则不显示此类别。
我只能选择只包含活动项的主要类别:

SELECT categories.title, count(analyses.id) FROM items
            INNER JOIN categories on items.category_id = categories.id
            WHERE categories.parent_id IS NULL
            AND categories.is_active = 1
            GROUP BY analyses.category_id
            ORDER BY analyses_categories.title

但与子类不能应付了,请告诉我谁有更多的经验。

mqxuamgl

mqxuamgl1#

有点不清楚你想做什么 count (仅与父级关联的活动项?),但我将使用 exists 要找出哪些子级也包含活动项,请执行以下操作:

select c.title, count(*)
from categories c
    join item i on i.category_id = c.id 
where c.parent_id is null and i.is_active = 1 and exists (
    select 1
    from categories c2
        join item i on c2.id = i.category_id
    where c2.parent_id = c.id and i.is_active = 1
)
group by c.title

相关问题