按日期+路径的物化路径排序顺序

时间:2015-02-14 07:38:19

标签: mysql materialized-path-pattern

我有带注释的数据库(物化路径)(mysql)。如果我选择所有通讯中的“select * from comm where post_id = 10 order by path ASC ”结果我有来自路径排序的评论,其中旧日期位于顶部,而较新位于底部。< / p>

那么,有没有办法像disqus一样选择更新的?如果我只是“按路径DESC排序” - 比分支显示颠倒 - 这不是我想要的。 所以我需要按日期排序(新的通讯在顶部)和路径。 谢谢!

链接到更大的图片https://drive.google.com/file/d/0BwIgYhO9h960ZTl4a24wNXFFQnM/view?usp=sharing

Bigger pic

3 个答案:

答案 0 :(得分:2)

你必须在第一点之后找到该部分。

然后你订购DESC直到第一部分,ASC在最后一部分之后。

SELECT * FROM comments 
  WHERE post_id=10
  ORDER by substring_index(path, '.', 1) DESC,
      path ASC

请注意,您在第三列的附件中出错,反转9972和9974.

在这种情况下,我不知道MySQL优化引擎是否使用路径上设置的索引来对结果进行排序。将列添加到模型中应该更有效。

答案 1 :(得分:0)

看起来您需要一组查询:

  1. 创建一个选择查询,其中选择主要注释(没有父级的注释)并按降序排序。
  2. 将这些结果与包含父记录的评论合并,并按升序日期对这些条目进行排序。
  3. 我建议查看包含联合的查询。这样您就可以组合两个结果集。这样做的缺点可能是当您拥有大量记录时,您的查询性能会受到影响。如果发生这种情况,您可以查看自联接查询等。

答案 2 :(得分:0)

  • 我需要一个depth字段,其中外部项目为1,但评论时为> 1。
  • 我需要一个top_of_thread,其中包含原始发布的时间戳。
  • 我需要一个订购时间戳。

由于path中缺少前导零,因此字符串比较不会总是正确的。因此,我要求timestamp

ORDER BY top_of_thread DESC, -- to get the newest thread at the top
    depth=1 DESC,  -- to sort top of thread before comments
    timestamp ASC  -- oldest comment first (or DESC?)

( path LIKE '% %' )似乎等同于( depth > 1 )