Порядок по логике для форума заметок

#mysql

Вопрос:

Я создал раздел заметок для своего сайта, который действует аналогично форуму с одним столом. У меня есть только 1 таблица с 6 полями: ID (основной идентификатор), Parent (который ссылается на идентификатор, с которым он связан), Employee_ID, Примечание, Peer_Name и отметка времени. Пользователь перейдет на сайт, и на страницу будут загружены все комментарии, оставленные для E_ID. Я бы хотел, чтобы он отображался в порядке возрастания идентификатора с любыми родительскими комментариями под идентификатором (чтобы показать иерархию). Моему запросу нужна некоторая помощь, так как я, похоже, не могу показать родительские комментарии для отображения под основным идентификатором.

Например, у меня есть записи с:

 ID Parent Employee_ID, Note,              Peer_Name,   Timestamp
1  NULL   999          note_blahblahblah  Smith, John  2021-10-25 01:00:01
3  1      999          note3_blah_blah    Cody, Jane   2021-10-27 15:00:02
5  NULL   999          note5_blahblah     Doe, Chuck   2021-10-27 16:00:03
7  NULL   999          note7_blahblah     Moe, Mi      2021-10-27 17:00:04
9  7      999          note9_blahblah     Lee, Vic     2021-10-27 18:00:05
 

Мне нужно, чтобы запрос отображался в порядке идентификатора с любыми родительскими строками под соответствующим идентификатором. Родитель 4 будет находиться под идентификатором 4 и так далее. Если Parent имеет значение NULL, строка не содержит под собой никаких строк.

Этот запрос не сработал. Любая помощь будет признательна.

 SELECT a.* 
from employee_notes a 
    LEFT JOIN employee_notes b on a.ID = b.Parent 
WHERE a.Employee_ID='999' 
ORDER BY a.ID ASC, b.Parent ASC, a.Timestamp ASC
 

Комментарии:

1. Вам нужно использовать UNION , чтобы сделать родительские отдельные строки.

2. Если я просто использую JOIN, строки с NULL исчезают.

3. JOIN помещает родительский элемент в ту же строку, что и дочерний.

4. @Barmar ваше решение с использованием union не дало правильных результатов. Столбец ID находится в порядке ASC, но родительский элемент не указан под соответствующим идентификатором. Требуется постоянная помощь.

Ответ №1:

Попробуйте это:

 SELECT *
FROM employee_notes
WHERE employee_id = '999'
ORDER BY IF(parent IS NULL, ID, parent), parent IS NULL DESC, timestamp
 

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

ДЕМОНСТРАЦИЯ

Комментарии:

1. Извините, я неправильно понял и поставил родителя на первое место.

2. Ура! Спасибо @Barmar, ваше решение сработало. большое спасибо.

3. похоже, в отправленном запросе все еще чего-то не хватает. Я добавил некоторые данные в вашу скрипку, чтобы более наглядно проиллюстрировать. sqlfiddle.com /#!9/1db2f/2 Я должен видеть идентификаторы в этом порядке для первых 4 строк, поскольку все они ссылаются на идентификатор 1. Порядок должен быть 1, 3, 9, 10. В вашем запросе отображаются только 3, 9, 10.

4. Вы сказали, что родитель должен быть ПОСЛЕ дочерних элементов. Итак, это 3, 9, 10, 1.

5. Если вы хотите сначала родительский элемент, измените на parent IS NULL DESC