2016-06-28 3 views
0

Это моя структура таблицы в моей базе данных:ВЫБРАТЬ дочерние категории и родительские категории, без детской категории

enter image description here

Теперь я хотел бы выделить следующие категории:

  • дочерних категории (Категории, где parent_category_id NOT 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 Head. Потому что это родительская категория с дочерними категориями.

Я хочу, чтобы следующие записи обратно:

  • Категория A
  • Категория B - Детский

Как я могу это сделать?

ответ

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) 

Существующие и объединенные соединения, как правило, считаются более эффективными с точки зрения производительности, но это может быть случай, когда это не будет просто проверка и просмотр что тебе нравится.

+1

круто, избегает 'не в', на всякий случай. [Опасности ..] (http://stackoverflow.com/a/32175659) – Drew

Смежные вопросы