0

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

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")

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

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

还想解决我使用它来页面评论的另一个问题。我可以使用一个简单的限制来仅获取 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")

但是,这会引发语法错误。

4

2 回答 2

1

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

 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 |
 +------------+---------+---------------------+-----------+------------+------------------------------+---------------------+-----------+
于 2013-03-21T16:10:12.010 回答
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 或任何适合您的需要)

于 2013-03-21T16:05:09.730 回答