php - 如何对多个用户插入不同位置的列表进行排序/排序?

标签 php mysql sorting linked-list

我正在制作一个应用程序,多个用户可以在其他评论的上方或下方发表评论。这不是一个线程类型的结构。这更像是在 Word 文档上进行协作。我在设计这些条目的排序方法时遇到了问题。

使用 mySQL 和 PHP,按输入时间排序不起作用,按评论位置排序也不起作用,因为如果用户在其他评论之间发帖,位置会发生变化。 我不想为每个新条目重新序列化评论位置(如果有数千个条目和数十个用户做同样的事情怎么办)。

设计这个的最佳方法是什么?

最佳答案

您所描述的是 linked list .问题是它们通常很难仅使用 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 中链表的更多信息:

关于php - 如何对多个用户插入不同位置的列表进行排序/排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005187/

相关文章:

PHP:在 MySQL Workbench 6.3 中使用 HTML 表单写入数据库

mysql - MySQL 中匹配时替换

MongoDB 按子集总和排序

linux - 根据另一个文件中的第一列对文件中的数据进行排序

php - nginx 可以提供 PHP 缓存的文件吗?

php - 在 CakePHP 中提交对象的表单数据时,跨表添加一对多关系的正确方法是什么?

php - 将 LaTeX 代码插入 MySQL

Mysql Foreach 从一个表到另一个表第 2 部分

php - 如何在 PDO 准备好的语句中使用 LIKE 子句?

r - 如何通过另一个变量对 data.frame 的列进行排序