类别表的结构:
- ID
- 标题
- parent_id
项目表的结构:
- ID
- 标题
- is_active(0 或 1)
- category_id
表通过一对多关系与category_id 字段关联。那些。 1 个类别可以有多个项目。
类别表中的两级层次结构。这定义了主要类别和子类别。类别是那些parent_id = NULL 的记录。以及子类别,这些记录是parent_id = 某个id 的记录。
一个项目可以同时属于主类别(其中parent_id = null)和子类别(子类别)。项目可以是事件的,也可以是非事件的(0 或 1)。
您需要进行查询并从类别表中选择所有具有事件项目 (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
但是子类别已经无法应付了,请告诉我谁更有经验。
最佳答案
有点不清楚您要计数
的内容(只是与父级关联的事件项目?),但我会使用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
关于mysql - 从包含类别和子类别的表中进行选择的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823471/