Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以从MYSQL中选择所有行,然后用PHP处理,并以JSON的形式返回有限的行数吗?_Php_Mysql - Fatal编程技术网

可以从MYSQL中选择所有行,然后用PHP处理,并以JSON的形式返回有限的行数吗?

可以从MYSQL中选择所有行,然后用PHP处理,并以JSON的形式返回有限的行数吗?,php,mysql,Php,Mysql,我正在创建一个有帖子和评论部分的网站。我对Evan Miller解释的“Bernoulli参数的Wilson分数置信区间下界”排序算法非常感兴趣 而且,我的注释系统有嵌套注释。我如何将注释存储在MYSQL中的postscomments表中,如下所示 Id | ParentId | Comment | PostId | ... 1 NULL Parent Comment 1 2 1 Child comment

我正在创建一个有帖子和评论部分的网站。我对Evan Miller解释的“Bernoulli参数的Wilson分数置信区间下界”排序算法非常感兴趣

而且,我的注释系统有嵌套注释。我如何将注释存储在MYSQL中的
postscomments
表中,如下所示

Id | ParentId | Comment             | PostId | ...
1    NULL       Parent Comment        1
2    1          Child comment         1
3    2          Grand Child comment   1
插入、更新和删除只是小菜一碟

选择是最糟糕的事情。让我告诉你我需要如何选择它

当我收到对我的
get comments.php
文件的AJAX请求时,我需要获取特定帖子的评论。(AJAX请求发送post ID)。因此,我需要选择根据该算法排序的帖子的评论

但是,问题是,我只需要选择30个家长评论,每个家长选择5个子评论。我不确定在MYSQL查询中如何同时进行排序和分组。这是我试过的

  • 它不起作用有两个原因。我无法将结果分组到父级,也无法限制结果。(递归内部不支持限制)
  • 我试了一些。但是,它们也不起作用
因此,最后我想到了选择全部并使用PHP进行处理,这成功了100%

这就是问题所在。它工作得很好。返回正确排序的分组结果

但是,我的问题是,我没有每个帖子的评论限制。那么,如果我每篇文章得到100000条或更多的评论,我的服务器会过载吗?这里不仅仅有一个帖子,所以我认为这不是最好的解决方案

你有更好的解决办法吗

有没有一种方法可以在MYSQL查询中完成所有这些工作,并减少我选择的行数

提前谢谢

添加:

下面是我需要得到的JSON响应的结构

{
   "parent": [
        // sorted parent comments
        {
            "Id": 4,
            "UserId": 2,
            "PostId": 1,
            // and other comment data
        },
        {
            // another comment
        }
   ],
   "4": [
       // sorted array of children of comment 4
       {
           // comment 4's  child
       },
       {
           // comment 4's child
       }
   ],
   "6": [
       // sorted array of children of comment 6
   ]
}

有没有一种方法可以让我首先对该算法上的注释进行排序,然后使用MYSQL查询仅选择前30个父注释,每个父注释仅选择5个子注释?(如果我可以这样做,我可以使用PHP将结果分组到这个JSON)

每次存储新投票时,请执行以下操作:

  • 在每个评论上存储向上投票和向下投票的总和(您可以只做“当前+=1”)-您将摆脱“左加入postscommentsvotes”
  • 将疯狂表达式的结果按顺序存储到comments表中的列中。(我们称之为优先级)
  • 使用预计算的排序优先级将搜索查询分为两个:

  • 搜索具有WHERE PostId=?按优先级顺序描述限制30。复合键(PostId、优先级)可能有用
  • 查询所有Id、ParentId,其中PostId=?按父项Id排序,Id
  • 从结果构造一棵树,并从第一个查询中排除不属于注释下的分支
  • 在(?)中使用ParentId查询子项,父项id是预构造id树的给定分支中注释的所有id(对每个父项执行此操作或组成联合)
  • 或者,分别为每个父级查询步骤2和处理步骤3,但它们可能重叠,很难说什么更好


    顺便说一句,第一部分可能是可选的,但由于您使用优先级将搜索查询一分为二,并且可能同时在同一行上使用它,因此它也会变快,因为您每次向上投票/向下投票只计算一次,而不是每次发布详细信息请求计算一次或两次。

    您给了我们很多信息,但我实际上没有看到一个明确的问题陈述。确切的问题是什么?我的问题是,选择所有行和进程是否可以。如果没有,是否有更好的方法可以直接从MYSQL中选择所需的行?答案是,通常情况下,与PHP相比,您可以在MYSQL上尽可能多地处理数据。也就是说,您应该尝试使用MySQL上的查询来处理您的需求。如果您发布的是清晰的表输入和预期的输出,也许有人可以帮助您。@SupunKavinda在第2步中,我特意对结果进行了排序,以便将较旧的注释放在第一位,这样您就可以迭代结果,让家长总是排在孩子之前。然后把它们放在这样一个数组结构中:实际上,考虑到它可能不需要是一个树,这可能就足够了:[1=>[2,3],2=>[5,8],3=>[4,6,7],4=>[],5=>[],6=>[],7=>[]](键是父id,值是所有直接子id的数组)就像现在的例子一样,如果你想让所有id的注释都以父id 1开头-你可以这样做,把1放在bucket中,获取子id(2,3),然后一个接一个地把它们也放在bucket中,寻找它的子id(2有5和8,3有4,6,7),如果它有,重复这个过程-把他们也放进桶里,然后寻找他们的孩子再次重复这个过程。。。直到所有的孩子都被扔进垃圾桶,分支中没有更多的评论,才会有更多的孩子。组合到branhes中可能会产生这样的结果:[1=>[1,2,3,4,5,6,7,8],2=>[2,5,8],3=>[3,4,6,7],4=>[4],5=>[5],6=>[6],7=>[7],8]]-这里的键是一个注释的ID和该分支中所有注释ID的值数组。只选择步骤1中返回的键作为parentID,并在步骤4中插入值数组作为查询的in(?)参数,或者,实际上它们不应该包含自己作为子对象,所以类似这样:[1=>[2,3,4,5,6,7,8],2=>[5,8],3=>[4,6,7],4=>[],5=>[]、6=>[]、7=>[]、8=>[]]或者他们,idk现在,你将必须计算:)希望你得到了一般的想法…无论如何,让我再说一件事,这种方法是调查一个主题中的所有行(或多或少),就像你做的一样,不同之处在于,这种方法只调查所有行中的两列(实际上,可能只有索引用于