草庐IT

php - 按另一列排序嵌套集(lft 和 rgt 除外)

coder 2023-10-13 原文

我正在尝试为网站 (PHP/MySQL) 创建一个评论部分,用户可以在其中发表评论 或回复已发布的。我了解到这有点棘手,因为 诸如 MySQL 之类的 RDBMS 并不是真正为存储分层数据而创建的。 我找到了 4 种解决方案(邻接表、路径枚举、嵌套集和闭包表) 其中我选择了嵌套集(修改后的预序树遍历)。 我已经成功地完成了对根评论和他们的回复进行提取和排序的工作 但我似乎无法找到一种方法来按点(其他列)对评论进行排序而不中断 父>子链接。

想象一下这样的表格:

+-------------------------------+
| id | comment | lft | rgt | pts|
+-------------------------------+
+-------------------------------+
| 1  | abc     | 1   | 8   | 3  |
+-------------------------------+
| 2  | 123     | 2   | 7   | 1  |
+-------------------------------+
| 3  | xyz     | 3   | 4   | 5  |
+-------------------------------+
| 4  | www     | 5   | 6   | 4  |
+-------------------------------+
| 5  | com     | 9   | 10  | 9  |
+-------------------------------+

如果我通过“lft ASC”订购 我得到标准的时间顺序(从旧到新):

(1) abc
--(2) 123
----(3) xyz
----(4) www
(5) com

如果按“rgt DESC”排序 我得到相反的结果,即先是新的(从新到旧):

(5) com
(1) abc
--(2) 123
----(4) www
----(3) wxy

所有这些都非常有效。 问题是我似乎无法找到一种方法来按点对评论进行排序。 最终我想得到这样的订单:

(5) com (9 pts)
(1) abc (3 pts)
--(2) 123 (1 pts)
----(3) xyz (5 pts)
----(4) www (4 pts)

有没有办法让嵌套集模型的行为像这样。 如果可能的话,最好的方法是使用正确的查询,但如果这样的查询不 存在用 PHP 订购它们也是可以接受的(如果它使用合理的资源)。 如果使用嵌套集模型这​​不太可能,我想知道 使用哪种模型来生成对上述评论进行排序的所有方式。

最佳答案

我相信这归结为获取深度,然后按深度排序,然后按点排序。

SELECT 
  c.*, 
  (COUNT(p.id) - 1) AS depth
FROM 
  comments AS c
  LEFT JOIN comments AS p ON c.lft BETWEEN p.lft AND p.rgt
GROUP BY c.id
ORDER BY depth, c.pts DESC

将产生:

id  comment lft     rgt     pts     depth
5   com     9       10      9       0
1   abc     1       8       3       0
2   123     2       7       1       1
3   xyz     3       4       5       2
4   www     5       6       4       2

关于php - 按另一列排序嵌套集(lft 和 rgt 除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315387/

有关php - 按另一列排序嵌套集(lft 和 rgt 除外)的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  4. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  5. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  8. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  9. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  10. ruby - 将一个超薄文件包含在另一个超薄文件中 - 2

    我在一个静态网站上工作(因此没有真正的服务器支持),我想在另一个网站中包含一个小的细长片段,可能会向它传递一个变量。这可能吗?在rails中很容易,虽然是render方法,但我不知道如何在slim上做(显然load方法不适用于slim)。 最佳答案 Slim包含Include插件,允许在编译时直接在模板文件中包含其他文件:require'slim/include'includepartial_name文档可在此处获得:https://github.com/slim-template/slim/blob/master/doc/incl

随机推荐