首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套注释系统mysql排序

嵌套注释系统mysql排序
EN

Stack Overflow用户
提问于 2013-03-21 10:00:21
回答 2查看 1.9K关注 0票数 0

好吧,我意识到有很多方法来完成评论。我选择的方式是像这样设置一张表。

代码语言:javascript
复制
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。很简单。所以我当然需要对评论进行排序。到目前为止,我是这样做的。

代码语言:javascript
复制
mysql_query("SELECT Comments.* FROM Comments ORDER BY 
IF(Comments.orig_comment = 0, Comments.id, Comments.orig_comment)DESC,Comments.id ASC")

这将首先获取最新的评论(这是我想要的),但当涉及到嵌套评论时,它会先按最旧的顺序进行排序(而不是我需要的)。我需要排序主要评论从最新到最旧,任何回复也应该从最新到最旧排序。我曾尝试修改我的查询来完成此操作,但没有成功,但无法弄清楚。

作为一个次要问题,从可用性的角度来看,这个系统是否有意义?你认为这样排列嵌套注释会让人困惑吗?我之所以这样做,是因为我的回复按钮位于基本评论上,一旦点击,就会在基本评论下面添加一个文本区。我只是想,如果你的帖子也放在基本评论的正下方,而不是一直扔到嵌套回复的底部,会更容易看到。对此有什么想法吗?

我还想解决另一个问题,我使用这个页面评论。我可以使用一个简单的限制来仅获得x个评论,如下所示:

代码语言:javascript
复制
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‘时强制限制,这样无论对一个评论有多少回复,它都会显示所有回复。我试过了

代码语言:javascript
复制
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")

但是这会抛出一个语法错误。

EN

回答 2

Stack Overflow用户

发布于 2013-03-22 00:10:12

考虑一下这个例子。

代码语言:javascript
复制
 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 |
 +------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+
票数 1
EN

Stack Overflow用户

发布于 2013-03-22 00:05:10

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

代码语言:javascript
复制
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

输出将为:

代码语言:javascript
复制
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或任何适合您需要的值)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15538168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档