Прежде чем вы начнете кричать ORDER BY id
, ситуация совсем иная.Упорядочить посты форума по времени последнего ответа
Форум, на котором меня просили сделать, - это форум гостевой книги, на котором незарегистрированные пользователи могут отвечать и делать сообщения. Ответы на сообщение отступы под сообщением, на который отвечает. Конечно, все это в неупорядоченных списках. Краткий пример:
- Основное сообщение
-
- Ответить на сообщение
-
-
- Ответ на ответ
-
-
- Другой ответ на главный
- пост, который не имеет ничего общего с ответами
Это вроде того, что система комментариев Nettuts+ «s выглядит. В базе данных сообщение имеет все очевидные вещи (id, тело сообщения, автор, время ...) и ответ. Ответ в основном означает, на что ответит этот пост. Если answerid равно 0, это главный пост (поток в обычном форуме означает).
Вот как я обхожусь вокруг отображения этих сообщений: сначала я вызываю функцию (назовем ее showPosts), которая имеет необязательный параметр, называемый replyid; по умолчанию - 0.
В showPosts Я захватываю все сообщения с ответом, равным параметру из базы данных в ассоциативном массиве, и заполняю поле posts
в массиве с результатами showPosts, и я передаю showPosts идентификатор почты. В конце showPosts я возвращаю этот ассоциативный массив. Если бы это было неясно, вот фрагмент кода:
function showPosts($postid = 0) {
$query = query("SELECT * FROM posts WHERE replyid='$postid'");
$r = array();
$i = 0;
while (@$row = $query->fetch_assoc()) {
$r[$i] = $row;
$r[$i]['posts'] = showPosts($row['id']);
++$i;
}
return $r;
}
Все работает прекрасно, как и следовало ожидать, но я топал по этой проблеме: Когда пользователь отвечает на старый пост, я хочу этот пост, чтобы показать первый, так же, как у вас есть в форумах.
Я уже думал о создании поля в базе данных, называемом lastChanged, и всякий раз, когда пользователь отправляет новый ответ, он продвигается вверх по цепочке сообщений и изменяет каждое из своих значений lastChanged на время публикации. Однако это казалось просто пустой тратой памяти и возможным убийцей времени. Я также думал о разделении основных потоков от ответов, но это сделало бы вещи немного более сложными на уме, и мне нравится красота, не имеющая значения между нитью и сообщением, поскольку все может быть либо потоком или должность.
Только так вы знаете, база данных MySQL и бэкенд написана в PHP (и, конечно, взаимодействие с MySQL с помощью MySQLi.)
Заранее спасибо, и извините, если что-то неясно.
Редактировать: Структура db, как и требовалось.
id | int(11)
title | varchar(100)
author | varchar(100)
body | text
replyid | int(11)
time | datetime
Прежде чем кричать «прежде чем вы кричите», вы должны разместить здесь таблицу (ы) структуры. это тривиальный список смежности или что? –
Идея 'lastChanged' была тем, что я собирался предложить - когда вы говорите, что это пустая трата памяти или убийца времени, что вы имеете в виду? Если этот столбец для 'ORDER BY' звучит как время для меня, вместо того, чтобы вычислять, какой порядок сообщений должен быть каждый раз. –
@Sam Starling - Когда я убил время, я имел в виду, что каждый раз, когда пользователь сохраняет сообщение, вам нужно будет подобрать цепочку ответов на вершину и на каждом шаге обновить поле. Позже это экономия времени, но я немного обеспокоен первоначальным исполнением. – Zirak