То, что вы описываете, представляет собой связанный список . Проблема в том, что их обычно трудно получить, используя только SQL. Мое решение состоит в том, чтобы использовать PHP для сортировки при поиске.
Ваш стол будет выглядеть примерно так:
CREATE TABLE page {
page_id INT,
first_comment_id INT
}
CREATE TABLE comment {
comment_id INT PRIMARY KEY AUTOINCREMENT,
page_id INT,
next_comment_id INT
}
Ваш запрос прост:
SELECT comment_id, next_comment_id
FROM comment
WHERE page_id = $page_id
ORDER BY comment_id DESC
Важным шагом является объединение результатов mysql_fetch_assoc () в массив, который индексируется в соответствии с comment_id:
$result = mysql_query($sql);
$indexed_list = array();
while ($row = mysql_fetch_assoc($result))
{
$indexed_list[$row['comment_id']] = $row;
}
В результате получается массив, подобный этому:
$indexed_list = array(
1 => array("comment_id"=>1, "next_comment_id"=>2),
2 => array("comment_id"=>2, "next_comment_id"=>5),
3 => array("comment_id"=>3, "next_comment_id"=>4),
4 => array("comment_id"=>4, "next_comment_id"=>0),
5 => array("comment_id"=>5, "next_comment_id"=>3));
Функция PHP для сортировки их в отображаемом порядке проста:
function llsort($indexed_list, $first_comment_id)
{
$sorted_list = array();
$node = $indexed_list[$first_comment_id];
array_push($sorted_list, $node);
do
{
$node = $indexed_list[$node['next_comment_id']];
array_push($sorted_list, $node);
} while ($node['next_comment_id'] != 0
AND isset($indexed_list[$node['next_comment_id']]) );
return $sorted_list;
}
Вы получаете first_comment_id из таблицы страниц. Конечно, вам все еще нужно реализовать функции для вставки узла и удаления узла, но они оставлены в качестве упражнений для читателя. Не забудьте использовать транзакции для вставки и удаления узлов.
Дополнительная информация о связанных списках в MySQL: