Drupal 6: порядок комментариев в стиле «Facebook» (с резьбой, по убыванию + по возрастанию) - PullRequest
0 голосов
/ 04 октября 2010

Работая с Drupal 6, моя цель состоит в том, чтобы упорядочить набор многопоточных комментариев, аналогично тому, как Facebook выводит комментарии: с «якорем» или первым комментарием в каждом потоке, отсортированном по DESC, и с любым «внутренним» потоком ответов, отсортированным по ASC, так чтоСамые новые комментарии находятся внизу.

Вот SQL-запрос из comment_render с упорядочением по COMMENT_ORDER_NEWEST_FIRST:

SELECT c.cid as cid, c.pid, c.nid,
c.subject, c.comment, c.format,
c.timestamp, c.name, c.mail,
c.homepage, u.uid, u.name AS
registered_name, u.signature,
u.picture, u.data, c.thread, c.status
FROM {comments} c INNER JOIN {users} u
ON c.uid = u.uid WHERE c.nid = 141737
AND c.status = 0 ORDER BY c.thread
DESC

Возвращает все комментарии, упорядоченные самой новой веткой:

03/
03.00/
02/
02.06/
02.05/
02.04/
02.03/
02.01/
02.00/
01/

В моем случае желаемый порядок выглядит следующим образом:

03/
03.00/
02/
02.00/
02.01/
02.02/
02.03/
02.04/
02.05/
02.06/
01/

Снова просто подумайте о стене Facebook, и вы поймете идею.

Может ли кто-нибудь помочь надлежащим образом улучшить SQL-запрос?В моем случае (но, возможно, не во всех случаях) глубина резьбы принудительно ограничивается 1 через пользовательский модуль.

Еще одно замечание - в моем случае он должен работать только под MySQL.

1 Ответ

0 голосов
/ 04 октября 2010

Ну, этот запрос работает, но опять же я нуб SQL, так что это, вероятно, не совсем правильно.

ВЫБРАТЬ c.cid как cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS зарегистрированное_имя, u.signature, u.picture, u.data, c.thread, c.status FROM (ВЫБЕРИТЕ c.cid как cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name КАК зарегистрированное_имя, u.signature, u.picture, u.data, c.thread, c.status ОТ comments c ВНУТРЕННИМ СОЕДИНЕНИЕМ users u ON c.uid = u.uid ГДЕc.nid = 141737 И c.status = 0 ПОРЯДОК ПОДСТРОЙКИ (нить, 1, (ДЛИНА (нить) - 1))) c ВНУТРЕННЕЕ СОЕДИНЕНИЕ users u ВКЛ c.uid = u.uid ГДЕ c.nid = 141737AND c.status = 0 ORDER BY SUBSTRING (thread, 1, 2) DESC

Идея состоит в том, чтобы сначала выполнить запрос с упорядочением на основе полного потока (02.05 и т. Д.), А затем выполнить другой SELECTтолько первые два символа поля потока.Могу ли я получить некоторую помощь в оптимизации этого или это иначе «правильно»?

...