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

标签 mysql sql select categories

类别表的结构:

  • ID
  • 标题
  • parent_id

项目表的结构:

  • ID
  • 标题
  • is_active(0 或 1)
  • category_id

table structure

表通过一对多关系与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/

相关文章:

mysql - 选择同时喜欢苹果和香蕉的人

mysql - 如何使用从 MySQL 中提取逗号分隔值的连接

mysql - 如何在sql查询中识别客户和供应商

php - 数据库不存在。但它确实

mysql - 使用 Workbench 保存在本地 PC(桌面)上的 SQL 数据库

mysql - WHERE 子句的第二个参数不起作用

MySQL 查询附加键 :value to JSON string

mysql - 如何连接两个表,保留不满足 JOIN 条件的行?

Javascript "selectElement.add(option, index)"在 Firefox 中工作,但在 Chrome 中工作

mysql - 选择用户在 mysql 中有多个不同的记录