0

フェイスブックを考えてみましょう。Facebook は、任意のステータスの最新の 2 つのコメントを表示します。私は似たようなことをしたいです。

、、、などのテーブルがstatus_idあります。次に、それぞれの最新の 2 つのコメントを取得します。comment_idcommenttimestampstatus_id

現在、最初GROUP_CONCATにすべての列をグループ化しstatus_id、次にSUBSTRING_INDEXwithを実行してい-2ます。

これにより、最新の 2 つのコメントが取得されますGROUP_CONCATが、status_id のすべてのレコードがオーバーヘッドになります。

SELECT SUBSTRING_INDEX(GROUP_CONCAT('~', comment_id,
                                    '~', comment,
                                    '~', timestamp) 
                        SEPARATOR '|~|'), 
        '|~|', -2)
FROM commenttable
GROUP BY status_id;

より良いアプローチを手伝ってもらえますか?

私のテーブルは次のようになります -

status_id comment_id コメントのタイムスタンプ

1          1    xyz1     3 hour
1          2    xyz2     2 hour
1          3    xyz3     1 hour
2          4    xyz4     2 hour
2          6    xyz6     1 hour
3          5    xyz5     1 hour    

だから私は出力が欲しい -

1          2    xyz2     2 hour
1          3    xyz3     1 hour
2          4    xyz4     2 hour
2          6    xyz6     1 hour
3          5    xyz5     1 hour
4

2 に答える 2

0

いくつかの闘争の後、私はこの解決策を見つけました-

以下は私にrow_idを与えます-

  SELECT a.status_id, 
         a.comments_id, 
         COUNT(*) AS row_num 
  FROM comments a
       JOIN comments b 
       ON a.status_id = b.status_id AND a.comments_id >= b.comments_id
  GROUP BY a.status_id , a.comments_id
  ORDER BY row_num DESC

合計行が表示されます-

SELECT com.status_id, COUNT(*) total 
FROM comments com 
GROUP BY com.status_id

メインの select の where 節で -

row_num = total OR row_num = total - 1

これにより、最新の 2 行が得られます。where 句を変更して、2 つ以上の最新の行をフェッチできます。

于 2012-05-20T09:33:01.710 に答える
0

これが私がここで出会った素晴らしい答えです:

select status_id, comment_id, comment, timestamp
from commenttable
where (
   select count(*) from commenttable as f
   where f.status_id = commenttable.status_id 
         and f.timestamp < commenttable.timestamp
) <= 2;

これはあまり効率的ではありませんが (O(n^2))、文字列を連結して部分文字列を使用して目的の結果を分離するよりもはるかに効率的です。ネイティブのデータベース インデックス作成ではなく文字列操作に戻すと、そもそもデータベースを使用する利点が失われると言う人もいます。

于 2012-05-03T22:40:31.097 に答える