【问题标题】:SELECT child categories and parent categories with no child categorySELECT 子类别和没有子类别的父类别
【发布时间】: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 类 - 儿童

我该怎么做?

【问题讨论】:

    标签: php mysql sql doctrine-orm categories


    【解决方案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 通常被认为在性能上更有效,但在这种情况下,它可能不仅仅是测试并查看您喜欢的内容。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多