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

Posted

技术标签:

【中文标题】SELECT 子类别和没有子类别的父类别【英文标题】:SELECT child categories and parent categories with no child category 【发布时间】:2016-06-28 16:33:50 【问题描述】:

这是我的数据库中的表结构:

现在我想选择以下类别:

子类别(parent_category_id 不为 NULL 的类别) 没有子类别的类别(parent_category_id 为 NULL,并且没有其他类别的 parent_category_id 等于该类别)

我试过这个查询:

SELECT * 
FROM category 
WHERE parent_category_id IS NOT NULL 
OR (id NOT IN (SELECT id FROM category WHERE parent_category_id IS NOT NULL) AND parent_category_id IS NULL)

在我的数据库中,我有以下记录:

但是当我执行查询时,他返回所有记录。而且我不想要记录B 类主管。因为它是有子类的父类。

我想要返回以下记录:

A 类 B 类 - 儿童

我该怎么做?

【问题讨论】:

【参考方案1】:

从性能的角度来看,您可以尝试以下几种方法,或者以防万一您喜欢不同的代码结构

使用 EXISTS 代替 IN (http://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html)

SELECT * 
FROM category c
WHERE parent_category_id IS NOT NULL 
OR 
(
  parent_category_id IS NULL 
  AND NOT EXISTS (SELECT * FROM category pc WHERE pc.parent_category_id = c.id)
)

或者使用连接

SELECT DISTINCT c.*
FROM category c
    LEFT JOIN category pc
    ON c.id = pc.parent_category_id
WHERE
    c.parent_category_id IS NOT NULL 
    OR (c.parent_category_id IS NULL
       AND pc.parent_category_id IS NULL)

Exists 和 Joins 通常被认为在性能上更有效,但在这种情况下,它可能不仅仅是测试并查看您喜欢的内容。

【讨论】:

酷,避免使用 not in ,以防万一。 Dangers of ..

以上是关于SELECT 子类别和没有子类别的父类别的主要内容,如果未能解决你的问题,请参考以下文章

获取总类别树(所有类别及其子类别的列表)与根据需要获取每个分支?

想要在cakephp 3中获得子类别产品

Woocommerce 插件 - 子类别的嵌套产品

处理类别和子类别 MySQL 或 JSON

单击时显示子类别

带有子类别的循环类别