从具有类别和子类别的表中进行选择的 SQL 查询
Posted
技术标签:
【中文标题】从具有类别和子类别的表中进行选择的 SQL 查询【英文标题】:SQL query for a selection from a table with categories and subcategories 【发布时间】:2018-11-22 05:21:50 【问题描述】:类别表的结构:
身份证 标题 parent_idItem 表的结构:
身份证 标题 is_active (0 или 1) category_idtable 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
但是子类已经不能应付了,请告诉我谁有更多的经验。
【问题讨论】:
你试过什么?考虑使用join
和exists
。
学校作业?
预期的结果会有所帮助,最好自己尝试一下。
我想不出在 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 查询的主要内容,如果未能解决你的问题,请参考以下文章
从具有交集和联合但也具有其他独特属性的两个表中进行 SQL 查询