Превращение многопоточных, обратных хронологических комментариев Drupal в комментарии в стиле Reddit - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть сайт 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';

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

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

класс | id | энергия

комментарий | 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. Если поток имел такие структуры:

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

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

1
1.1
1.1.1
1.1.2
1.2
1,3

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

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

Ответы [ 3 ]

0 голосов
/ 22 сентября 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

Должен сделать свое дело.

0 голосов
/ 22 сентября 2009

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

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

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

А если вы захотите это увидеть, вот вывод 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

0 голосов
/ 22 сентября 2009

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

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

...