Превращение потоковых, обратных хронологических комментариев 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';
Таблица, к которой мне нужно присоединиться, называется радиоактивностью и выглядит следующим образом
@radioactivity
класс | 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. Если поток имел такие структуры:
комментарий
-комментарий
--комментарий
--комментарий
-комментарий
-комментарий
Значения c.thread будут
1
1,1
1.1.1
1.1.2
1.2
1,3
Я хочу сохранить эту структуру, но иметь комментарии в каждом уровне упорядоченного потока, основанные на их текущем счете, а не их значении c.thread.
Я знаю, что это много и очень подробно, но я подумал, что это лучшее место.
3 ответа
Мне было интересно узнать о радиоактивности, поэтому я взглянул на это.
В представлениях обработчик сортировки радиоактивности предоставляет следующее руководство:
LEFT JOIN: Include all comments
INNER JOIN: Include only comments that have radioactivity data (faster)
А в случае, если вы хотите это увидеть, вот вывод SQL Views:
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
Во-первых, вы не должны делать внутреннее соединение с радиоактивной таблицей, делая то, что вам требуется, чтобы было совпадение, вместо этого вы можете сделать левое соединение или просто соединение. Я не эксперт по SQL, поэтому не уверен, в чем разница между объединением и левым соединением.
Что касается порядка, я не думаю, что возможно сохранить нить и упорядочить их в зависимости от их энергии. Не в SQL, что есть. То, что я хотел бы сделать, чтобы получить комментарии как потоки, где-то я уверен, что они будут преобразованы в массив, содержащий древовидную структуру. Я бы использовал этот массив в качестве основы для упорядочения, поскольку вы довольно легко могли бы переставить различные ветви на основе любых критериев сортировки, которые вы хотите.
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
Должен сделать свое дело.