尝试在我的网站上对三个层次结构的评论进行排序时遇到了困难。
我有一个表'评论',其中包含评论的评论或答案。这些评论有cid
唯一标识符pid
,如果前评论是对其他评论的回答,则表示父评论的cid
,以及thread
领域。
此线程基于特定模式构建:“00 /”,“01 /”等是0级注释,“00.00 /”,“00.01”等是对注释“00 /”等的回复。 / p>
我只想要三个级别的层次结构,这意味着thread
不会长于“xx.xx.xx /”
我想对从最新到最旧的评论进行排序,但是反过来将回复排序。
简单示例:
02/
02.01/
02.01.00/
02.02/
02.03/
02.03.00/
02.03.01/
01/
01.00/
00/
(希望我明确表达了你的理解!)
重点是我并不擅长SQL查询,如果你能帮我解决这个问题,我会很高兴
到目前为止,我的查询有效,但仅适用于0级和1级评论:
SELECT `cid` , `thread`
FROM `comment`
ORDER BY SUBSTR(`thread`, 1, 2 ) DESC , `cid` ASC
这是结果:
0z/
0z.00/
0z.01/
0z.00.00/
0z.00.01/
0z.01.00/
0z.01.01/
0y/
0x/
...
你有什么想法吗? (请说明一点......谢谢!)
答案 0 :(得分:0)
也许您需要二阶和三阶条件:
SELECT `cid` , `thread`
FROM `comment`
ORDER BY SUBSTR(`thread`, 1, 2 ) DESC , SUBSTR(`thread`, 4, 2 ) ASC, SUBSTR(`thread`, 7, 2 ) ASC
对第一部分下降进行排序,每个第一部分内部的第二部分上升,每个第二部分内部的第三部分也上升。
答案 1 :(得分:0)
我建议为线程使用三个单独的字段,并使每个字段成为int或tinyint。让我们调用ThreadLevel1,ThreadLevel2和ThreadLevel3字段。否则,当您的表变大时,排序将花费很长时间。然后就可以了
select cid, concat(ThreadLevel1, ThreadLevel2, ThreadLevel3)
from comment
order by ThreadLevel1 desc, ThreadLevel2 asc, ThreadLevel3 asc
您还需要定义和索引。很可能您可以在ThreadLevel1上使用索引,但您也可以从(ThreadLevel1,ThreadLevel2,ThreadLevel3)上的多列索引中受益。由于第一个是下降而其余是上升,我不确定多列在这种情况下会有所帮助。