SELECT 个子类别和没有子类别的父类别
SELECT child categories and parent categories with no child category
这是我数据库中的 table 结构:
现在我想select以下几类:
- 子类别(parent_category_id 不为空的类别)
- 没有子类别的类别(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)
在我的数据库中有以下记录:
但是当我执行查询时他 returns 所有记录。而且我不想要记录 B 类头。因为是父类带子类。
我想要以下记录:
- A 类
- B 类 - 儿童
我该怎么做?
从性能的角度或以防万一您更喜欢不同的代码结构,您可以尝试以下几种方法
使用 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 通常被认为在性能上更有效,但在这种情况下,它可能不只是测试,看看你喜欢什么。
这是我数据库中的 table 结构:
现在我想select以下几类:
- 子类别(parent_category_id 不为空的类别)
- 没有子类别的类别(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)
在我的数据库中有以下记录:
但是当我执行查询时他 returns 所有记录。而且我不想要记录 B 类头。因为是父类带子类。
我想要以下记录:
- A 类
- B 类 - 儿童
我该怎么做?
从性能的角度或以防万一您更喜欢不同的代码结构,您可以尝试以下几种方法
使用 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 通常被认为在性能上更有效,但在这种情况下,它可能不只是测试,看看你喜欢什么。