从具有类别和子类别的表中进行选择的 SQL 查询

Posted

技术标签:

【中文标题】从具有类别和子类别的表中进行选择的 SQL 查询【英文标题】:SQL query for a selection from a table with categories and subcategories 【发布时间】:2018-11-22 05:21:50 【问题描述】:

类别表的结构:

身份证 标题 parent_id

Item 表的结构:

身份证 标题 is_active (0 или 1) category_id

table structure

表格通过一对多的关系与 category_id 字段相关联。那些。 1 个类别可以有多个项目。

类别表中的两级层次结构。这定义了主要类别和子类别。类别是 parent_id = NULL 的那些记录。以及子类别,这些是其中 parent_id = 到某个 id 的那些记录。

一个项目既可以属于主类别(其中 parent_id = null),也可以属于子类别(子类别)。项目可以是活动的,也可以是非活动的(0 或 1)。

您需要进行查询并从 Category 表中选择所有具有活动项目 (is_active = 1) 的主要类别(其 parent_id = null),并且其子类别也具有活动项目。 即如果子子类别有 is_active = 0 的项目,则不显示该类别。

我只能选择只有活动项目的主要类别:

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

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

【问题讨论】:

你试过什么?考虑使用joinexists 学校作业? 预期的结果会有所帮助,最好自己尝试一下。 我想不出在 1 个查询中执行此操作的方法。我只需要选择主要类别,其中只有活动项目。 您在这方面的目标不是很明确。试着在最后的陈述中澄清你想要达到的目标。还请先向我们展示您的想法,以便我们为您指明方向,而不是替您做。 【参考方案1】:

有点不清楚您要尝试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

【讨论】:

由于某种原因一个空结果( 我正在尝试输出 parent_id = null 的类别,其中包含具有活动元素的子类别 + 具有活动元素的类别 @tirael8 这是一个示例演示(似乎对我有用):db-fiddle.com/f/c3LUJ6GqZUDod2PrT6Kb9v/0 有了子类别,一切都是正确的。但是还是需要加一个条件,如果第1项或第2项或第3项处于活动状态,那么blah1或blah2或blah 3也输出 @tirael8 抱歉,这没有多大意义。此时,使用示例数据和预期结果重写您的问题。如果您不关心子类别,请删除上面的exists 声明...

以上是关于从具有类别和子类别的表中进行选择的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

根据条件选择查询和计数

MySQL选择多对多的位置

从具有交集和联合但也具有其他独特属性的两个表中进行 SQL 查询

选择一个包含子类别的类别并将它们放入 DataGridView 中,没有类别重复

SELECT 子类别和没有子类别的父类别

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?