Хорошо, я посмотрел ВЕЗДЕ о том, как сортировать / упорядочивать иерархические данные с каким-то произвольным значением, например, по алфавиту, наибольшим голосам и т. Д. Есть ли у кого-нибудь из вас решения для вложенного набора или чего-то еще?
Вот пара примеров запросов, которые парень сделал на reddit в моей ветке, и я добавил (объединение множества выборок .. help?):
http://sqlfiddle.com/#!9/6dd457/10 — в алфавитном порядке и все еще в порядке
http://sqlfiddle.com/#!9/786d89/36 — сначала в порядке наибольших голосов
Это списки смежности в основе, и mysql создает материализованный путь на основе вашего параметра сортировки на лету. Это будет генерироваться каждый раз, когда кто-то переходит на viewtopic.php, так как у каждого пользователя есть своя собственная сортировка.
Теперь есть несколько проблем с этим подходом. Во-первых, просмотр всех этих отборов и соединений заставляет меня немного волноваться. Я предполагаю, что есть намного более оптимизированный способ сделать все это.
Php может использоваться для определения наивысшего значения родительского узла, количества слоев, которые мы хотим сгенерировать из этого, и форматирования некоторых других вещей, но здесь есть проблема с этим дерьмом:
(1000 — l1.TotalVotes) + (2 * l1.Negatives) — необходимо повторить как 5 раз во всем запросе
Я пытался сделать ((1000 — l1.TotalVotes) + (2 * l1.Negatives)) AS l1.Votes в его уважаемом запросе на выбор, но я получил ошибку: / это был бы один шаг к тому, чтобы сделать его чище.
Моя конечная цель состоит в том, чтобы сделать запрос, который мог бы сортировать в нужном мне порядке, поэтому я могу просто использовать шаблоны с информацией о глубине для генерации HTML, не используя php больше, чем мне нужно, видя, как SQL больше эффективный и предназначен для такого рода вещей. Меня больше всего беспокоит, что подобный запрос будет плохим для крупных сайтов.
Конечная цель состоит в том, чтобы иметь что-то такое же быстрое, как reddit: вложенные комментарии с возможностью сортировки по дате публикации, общему количеству голосов и некоторым другим параметрам, используя как можно больше mysql и как можно меньше php. Если у вас есть какие-либо решения для этого с использованием таблиц замыкания, вложенных множеств или просто материализованных путей, я бы хотел их услышать. Решение, которое я здесь имею, выглядит оптимизированным и пугающим.
Задача ещё не решена.
Других решений пока нет …