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

したがって、最初のレベルがあることを明確にするために、ユーザーはそのコメントに返信できます(これらは2つのレベルのみです)。それぞれに一意の増分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 のため)。ソート文字列を作成し、それを 10 進数にキャストしてソートを正しく行います。(ただし、mysqlはとにかくそれを正しく処理すると思います。)

これは機能しますが、並べ替え値を事前に計算してから、基本レベルのコメントに適切な値を作成することをお勧めします。(おそらく2.9に設定するか、ニーズに合ったものに設定してください)

于 2013-03-21T16:05:09.730 に答える