好吧,我意识到有很多方法来完成评论。我选择的方式是像这样设置一张表。
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")但是这会抛出一个语法错误。
发布于 2013-03-22 00:10:12
考虑一下这个例子。
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-22 00:05:10
感谢你评论中的答案,我尝试并找到了一个解决方案,它不是很漂亮,但它似乎完成了工作。
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或任何适合您需要的值)
https://stackoverflow.com/questions/15538168
复制相似问题