2015-02-14 4 views
0

У меня есть база данных с комментариями (материализованный путь) (mysql). Если я выберу все comm `с 'select * from comm, где post_id = 10 order by path ASC" В результате у меня есть комментарии из сообщения, упорядоченного по пути со старой датой сверху и новее внизу.Материализованный путь сортировки по дате + путь

Итак, есть ли способ выбрать новее сверху, как в disqus? если я просто «заказываю по пути DESC» - чем ветвь отображается вверх дном - это не то, что я хочу. Мне нужен порядок по дате (новый комм сверху) и путь. Спасибо.!

ссылка на большой ПИК https://drive.google.com/file/d/0BwIgYhO9h960ZTl4a24wNXFFQnM/view?usp=sharing

Bigger pic

+0

Возможно, это слишком просто, но вы пробовали использовать «ЗАКАЗАТЬ по дате, пути»? – Phate01

+0

@SERG Пожалуйста, см. Мой ответ, я уверен, что это то, что вы хотите. –

ответ

2

Вам просто нужно найти деталь после первого момента.

Затем вы заказываете DESC до первой части и ASC после последней части.

SELECT * FROM comments 
    WHERE post_id=10 
    ORDER by substring_index(path, '.', 1) DESC, 
     path ASC 

Обратите внимание, что у Вас есть ошибка в вашем прикрепленном файле в третьей колонке, инвертирование 9972 и 9974.

Я не знаю, если, в данном случае, оптимизация MySQL использует множество индексов на пути к сортировке результата. Должно быть более эффективным добавить столбец в вашу модель.

+0

Единственный полезный индекс - один, начинающийся с 'post_id'. «path» в индексе не поможет, потому что (1) он находится внутри функции и (2) смесь DESC и ASC. –

0

Похоже, вам необходимо сочетание запросов:

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

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

0
  • Мне нужны depth поля, которое говорит 1 для внешних элементов, а> 1 для комментариев.
  • Мне нужен top_of_thread, который содержит отметку времени оригинальной публикации.
  • Мне нужна отметка времени для заказа.

Из-за отсутствия ведущих нулей в path сравнение строк не всегда будет правильным. Следовательно, моя просьба о timestamp.

ORDER BY top_of_thread DESC, -- to get the newest thread at the top 
    depth=1 DESC, -- to sort top of thread before comments 
    timestamp ASC -- oldest comment first (or DESC?) 

(path LIKE '% %') кажется, что эквивалентно (depth > 1)?