Поиск «листа» в дереве с использованием MySQL

Я пытаюсь определить «Лист» в дереве, но я не понимаю, почему мой запрос не дает мне того, что я хочу.

Вот проблема:

Поиск «листа» в дереве с использованием MySQL

Итак, моя идея заключается в том, что пока идентификатор не находится в столбце p_id, он должен быть «листом».

select id, 'Leaf' as type
from Tree
where id not in (select distinct(p_id)
                 from Tree)

Однако приведенный выше запрос ничего мне не возвращает.

Решение почти такое же, как у меня, за исключением того, что оно указывает, что p_id не может быть NULL, тогда оно возвращает то, что я хочу.

select id
from Tree
where id not in(select distinct(p_id) 
                from Tree 
                where p_id IS NOT NULL)

Я смущен, почему добавление предложения where будет иметь значение?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
24
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ты угадал. Это потому, что NULL ни с чем не сравнивается. Значение не отличается от нуля, а значение не равно нулю.

Вы можете получить результат с помощью следующего запроса:

select distinct t.id, 
  if (p.id is null, 'Root', if (d.id is null, 'Leaf', 'Inner'))
from Tree t
  left join Tree p on p.id=t.p_id
  left join Tree d on d.p_id=t.id;

См. dbfiddle.

^^ Ага. null не равняется ничему, даже самому себе.

SOS 21.03.2022 01:22

Итак, пока в списке есть NULL, даже если есть совпадение с другим p_id, ничего не появится?

DJ-coding 21.03.2022 03:12

@DJ-кодирование - Да. Выражение предложения where оценивается как истинное только в том случае, если id не соответствует Любые возвращаемых значений p_id. Поскольку одно из значений p_id равно null, а null считается неизвестным и никогда не может ничего равный, выражение никогда не оценивается как истинное. Следовательно, строки не возвращаются.

SOS 21.03.2022 06:54

выбрать отдельный a_id, статус из ( выберите a.id как a_id, a.pid как a_pid, b.id как b_id, b.pid как b_pid, случай, когда b.id не равен нулю, а a.pid не равен нулю, тогда «внутренний» Когда b.id равен нулю, тогда «лист», когда a.pid равен нулю, тогда «root», иначе null заканчивается как «status»

из листа a левое соединение листа b на a.id = b.pid)temp

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 21.03.2022 08:53

Другие вопросы по теме