嵌套注释系统mysql排序

时间:2013-03-21 02:00:21

标签: mysql database comments sql-order-by

好的,我意识到有很多方法可以完成评论。我选择的方式是这样设置的单个表。

id    comment    date       time    orig_comment
1     Hello   03-01-2013  10:10:10       0
2     Hello   03-02-2013  10:10:10       0
3     Hello   03-03-2013  10:10:10       1

因此要清除第一级,然后用户可以回复该评论(这些是仅有的两个级别)。我给每个唯一的递增id,并指定orig_comment。如果orig_comment为“0”,那么它是基级注释,如果它是嵌套的,则orig_comment将是原始注释的id。很简单。所以我当然需要订购评论。我现在就是这样做的。

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC")

这可以获得最先检索的最新注释(这是我想要的),但是当涉及到嵌套注释时,它首先按照最早的注释(不是我需要的)来命令它们。我需要订购从最新到最旧的主要评论,并且还应该从最新到最旧订购任何回复。我试过没有成功修改我的查询来做到这一点,但无法弄明白。

作为一个侧面问题,这个系统从可行性的角度来看是否有意义?您是否认为以这种方式排序嵌套注释会令人困惑?我想这样做是因为我的回复按钮位于基本注释上,一旦点击,就会在基本注释的正下方添加一个textarea。我只是觉得如果你的帖子也在基础评论的正下方而不是一直被抛到嵌套回复的底部会更容易看到你的帖子。有什么想法吗?

还想解决另一个我用它来评论的问题。我可以使用一个简单的限制来获得这样的x个注释:

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC 
LIMIT 0, $page")

这种方法显然没有注意每个主要评论的回复数量。所以我最终切断了对最后一个主要评论的回复。我想仅在orig_comment ='0'时强制执行限制,这样无论对评论有多少回复,它都会显示所有这些。我试过了

mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC 
LIMIT 0, SELECT COUNT(id)FROM Comments WHERE orig_comment='0' LIMIT $page")

这会引发语法错误。

2 个答案:

答案 0 :(得分:0)

感谢您的评论中的答案,我尝试了并找到了解决方案,但它并不是很漂亮,但它似乎完成了工作。

SELECT *, CASE orig_comment
    WHEN 0 THEN CONCAT_WS('.',id,LPAD((SELECT MAX(id)+1 FROM Comments WHERE orig_comment = C.id),3,'0'))
    ELSE CONCAT_WS('.',orig_comment,LPAD(id,3,'0'))
END AS sort
FROM Comments as C
ORDER BY sort DESC

输出将是:

id  comment time        orig_comment    sort
2   Hello   "2013-03-21 16:19:00"   0   2.005
3   Hello   "2013-03-21 16:19:00"   2   2.003
4   Hello   "2013-03-21 16:19:00"   2   2.004
1   Hello   "2013-03-21 16:19:00"   0   1

排序时不会有麻烦,最多允许999个子评论(由于LPAD值为3) 它的作用是创建一个排序字符串,然后将其转换为十进制以使排序正确。 (不过我认为mysql确实可以正确处理它。)

即使这有效,我建议预先计算排序值,然后为基本级别注释创建一个好的值。 (可能将其设置为2.9或任何适合您需要的东西)

答案 1 :(得分:0)

考虑这个例子......

 DROP TABLE IF EXISTS comments;

 CREATE TABLE comments
 (comment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,comment VARCHAR(50) NOT NULL   
 ,comment_date DATETIME
 ,parent_id INT NULL
 );

 INSERT INTO comments VALUES
 (1     ,'Hello',                           '2013-03-01 10:10:10',NULL),
 (2     ,'Bonjour',                         '2013-03-02 10:10:10',NULL),
 (3     ,'How are you?',                    '2013-03-03  10:10:10',1),
 (4     ,'I\'m fine thank you, and you?',   '2013-03-04 10:10:10',1),
 (5     ,'Ça va?',                          '2013-03-05 10:10:10',2),
 (6     ,'Je vais bien, merci, et toi?',    '2013-03-06 10:10:10',2),
 (7     ,'Yes, not too bad thanks',         '2013-03-07 10:10:10',1),
 (8     ,'Oui, comme ci comme ça.',         '2013-03-08 10:10:10',2),
 (9     ,'Bon, à bientôt.',                 '2013-03-09 10:10:10',2),
 (10    ,'See you soon',                    '2013-03-10 10:10:10',1);

 SELECT * 
   FROM comments 
      x 
   JOIN comments y 
     ON y.parent_id = x.comment_id 
  ORDER 
     BY x.comment_date
      , y.comment_date;
 +------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+
 | comment_id | comment | comment_date        | parent_id | comment_id | comment                      | comment_date        | parent_id |
 +------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+
 |          1 | Hello   | 2013-03-01 10:10:10 |      NULL |          3 | How are you?                 | 2013-03-03 10:10:10 |         1 |
 |          1 | Hello   | 2013-03-01 10:10:10 |      NULL |          4 | I'm fine thank you, and you? | 2013-03-04 10:10:10 |         1 |
 |          1 | Hello   | 2013-03-01 10:10:10 |      NULL |          7 | Yes, not too bad thanks      | 2013-03-07 10:10:10 |         1 |
 |          1 | Hello   | 2013-03-01 10:10:10 |      NULL |         10 | See you soon                 | 2013-03-10 10:10:10 |         1 |
 |          2 | Bonjour | 2013-03-02 10:10:10 |      NULL |          5 | Ça va?                       | 2013-03-05 10:10:10 |         2 |
 |          2 | Bonjour | 2013-03-02 10:10:10 |      NULL |          6 | Je vais bien, merci, et toi? | 2013-03-06 10:10:10 |         2 |
 |          2 | Bonjour | 2013-03-02 10:10:10 |      NULL |          8 | Oui, comme ci comme ça.      | 2013-03-08 10:10:10 |         2 |
 |          2 | Bonjour | 2013-03-02 10:10:10 |      NULL |          9 | Bon, à bientôt.              | 2013-03-09 10:10:10 |         2 |
 +------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+
相关问题