Преобразование цепочек комментариев к историям Drupal в обратном хроно в комментарии в стиле Reddit

У меня есть сайт Drupal, который в настоящее время отображает комментарии в цепочке, в обратном хронологическом порядке. Я пытаюсь изменить его, чтобы он работал как Reddit/Hacker News, где потоки и комментарии в каждом потоке вместо этого упорядочены по их текущему счету на основе системы голосования, которую я добавил.

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

Вот запрос:

$query = '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.picture, u.data, c.score, c.users, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d  ORDER BY c.thread DESC';

Таблица, к которой мне нужно присоединиться, называется радиоактивностью и выглядит так.

@радиоактивность

класс | идентификатор | энергия

комментарий | 1 | 5
комментарий | 2 | 8
комментарий | 3 | 27
комментарий | 4 | 13

Столбец id в этой таблице синхронизируется со столбцом cid в таблице комментариев.

Я пробовал это, чтобы ввести данные о подсчете очков:

$query = "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.picture, u.data, c.score, c.users, c.thread, c.status, r.energy, r.id, r.class FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid INNER JOIN {radioactivity} r ON c.cid = r.id WHERE c.nid = %d AND r.class = 'comment' ORDER BY c.thread DESC";

Этот запрос возвращает только комментарии, содержащие записи в таблице радиоактивности. комментарии, которые не получили ни одного голоса, вообще не отображаются в таблице, поэтому они не захватываются. Как мне изменить это, чтобы получить все комментарии?

И тогда как мне изменить конец запроса, чтобы он упорядочивал комментарии по баллам, сохраняя при этом их в своих цепочках?

Сейчас комментарии сортируются на основе c.thread. Если бы поток имел такую ​​структуру:

комментарий
-комментарий
--комментарий
--комментарий
-комментарий
-комментарий

Значения c.thread будут

1
1.1
1.1.1
1.1.2
1.2
1.3

Я хочу сохранить эту структуру, но упорядочить комментарии на каждом уровне ветки на основе их текущей оценки, а не их значения c.thread.

Я знаю, что это много и очень подробно, но я подумал, что это лучшее место.


person bflora2    schedule 22.09.2009    source источник


Ответы (3)


Во-первых, вы не должны делать внутреннее соединение с радиоактивной таблицей, для этого вам нужно, чтобы было совпадение, вместо этого вы можете сделать левое соединение или просто соединение. Я не эксперт по SQL, поэтому не уверен, в чем именно разница между соединением и левым соединением.

Что касается порядка, я не думаю, что возможно сохранить тему и упорядочить их в зависимости от их энергии. Не в SQL то есть. Что бы я хотел получить комментарии в виде цепочки, где-то я уверен, что они будут преобразованы в массив, содержащий древовидную структуру. Я бы использовал этот массив в качестве основы для упорядочивания, поскольку вы довольно легко сможете переупорядочивать различные ветки на основе любых критериев сортировки, которые вы хотите.

person googletorp    schedule 22.09.2009

Мне было любопытно узнать о радиоактивности, поэтому я взглянул на это.

В представлениях обработчик сортировки радиоактивности предоставляет следующее руководство:

  • LEFT JOIN: Include all comments
  • INNER JOIN: Include only comments that have radioactivity data (faster)

И если вы хотите это увидеть, вот вывод Views SQL:

SELECT comments.cid AS cid, radioactivity_comment_1_f.energy AS radioactivity_comment_1_f_energy, COALESCE(radioactivity_comment_1_f.energy,0) AS radioactivity_comment_1_f_energy_sortkey, comments.timestamp AS comments_timestamp FROM comments comments LEFT JOIN radioactivity radioactivity_comment_1_f ON comments.cid = radioactivity_comment_1_f.id AND (radioactivity_comment_1_f.class = 'comment' AND radioactivity_comment_1_f.decay_profile = 1) ORDER BY radioactivity_comment_1_f_energy_sortkey DESC, comments_timestamp ASC

person Grayside    schedule 22.09.2009
comment
К сожалению, я использую Drupal 5, поэтому не могу использовать представления для упорядочения комментариев. Похоже, что этот запрос также не учитывает значение потока комментария. - person bflora2; 22.09.2009
comment
Объяснение разницы между ЛЕВЫМ СОЕДИНЕНИЕМ и ВНУТРЕННИМ СОЕДИНЕНИЕМ по-прежнему должно быть действительным, оно исходит из модуля «Радиоактивность», а не из представлений. Возможно, вы захотите добавить Drupal-5 в свои теги. - person Grayside; 23.09.2009

Googletorp прав насчет внешнего соединения, я думаю, что левое внешнее правильно для этого случая.

И тогда как мне изменить конец запроса, чтобы он упорядочивал комментарии по баллам, сохраняя при этом их в своих цепочках?

У вас может быть несколько порядков по пунктам. У меня нет вашей схемы, поэтому я не могу проверить, но что-то вроде:

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.picture,
       u.data,
       c.score,
       c.users,
       c.thread,
       c.status,
       COALESCE (r.energy,0) as energy
FROM {comments} c
INNER JOIN {users} u ON c.uid = u.uid 
LEFT OUTER JOIN {radioactivity} r ON (c.cid = r.id AND r.class = 'comment')
WHERE c.nid = %d 
ORDER BY c.thread DESC, energy DESC

Должен сделать трюк.

person Jeremy French    schedule 22.09.2009
comment
-1 Когда вы заказываете с помощью c.thread, вы получаете абсолютный порядок, поэтому 2-е предложение order_by будет бесполезным. Предложение 2-го порядка будет работать только в том случае, если некоторые из них будут ранжированы одинаково по первому предложению. В данном случае это невозможно. - person googletorp; 22.09.2009
comment
Вы правы в том, что нить абсолютна, мой плохой. Но это возможно. - person Jeremy French; 22.09.2009