使用SQL对不同方向的注释和回复进行排序

时间:2015-07-09 09:41:41

标签: mysql

尝试在我的网站上对三个层次结构的评论进行排序时遇到了困难。

我有一个表'评论',其中包含评论的评论或答案。这些评论有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/
...

你有什么想法吗? (请说明一点......谢谢!)

2 个答案:

答案 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)上的多列索引中受益。由于第一个是下降而其余是上升,我不确定多列在这种情况下会有所帮助。