#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