选择没有子类别的子类别和父类别

时间:2016-06-28 16:33:50

标签: php mysql sql doctrine-orm categories

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

enter image description here

现在我想选择以下类别:

  • 子类别(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)

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

enter image description here

但是当我执行查询时,他返回所有记录。我不希望记录 B类头。因为它是具有子类别的父类别。

我想要回复以下记录:

  • A类
  • B类 - 儿童

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以从性能角度尝试以下几种方法,或者只是在您喜欢不同的代码结构的情况下

使用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)

存在和联接通常被认为在性能上更有效,但这可能是一个不仅仅是测试并看到你喜欢的情况。