0

MySQL データベースにコメントを保存するために使用する 2 つのテーブルがあります。

1 つ目は、コメント ID、コメントが投稿されたページ、コメントを書いたユーザー、別のコメントへの返信であるかどうか (それぞれ以下) を格納します。

Comments
---------------------------------
CommentId    BIGINT      PK,NN,AI
OwnerId      BIGINT      
AuthorId     BIGINT      
ParentId     BIGINT      
Created      TIMESTAMP   

2 つ目は、コメントの内容を格納します。

CommentsContent
----------------------------------
ContentId    BIGINT      PK,NN,AI
CommentId    BIGINT      
Content      TEXT        
Created      TIMESTAMP   

したがって、Comments次のレコードがあるとします。

CommentId  OwnerId  AuthorId  ParentId  Created
-----------------------------------------------------------
        1        1         2         0  2013-01-31 01:23:45
        2        1         2         0  2013-01-31 01:23:45

CommentsContentコメントの編集履歴を示す次のレコードがあります。

ContentId  CommentId  Content           Created
-----------------------------------------------------------
        1          1  Testing           2013-01-31 01:23:45
        2          2  Another test      2013-01-31 01:23:45
        3          1  Testing1          2013-01-31 01:23:46
        4          1  Testing123        2013-01-31 01:23:47

Createdここで、最新のコメントとその最終更新日 ( の列)を取得したいと考えていますCommentsContent

私は試した:

SELECT
    c.CommentId,
    c.AuthorId,
    c.ParentId,
    c.Created,
    cc.Created as Updated,
    cc.Content
FROM
    Comments as c
JOIN
    CommentsContent as cc
ON
    cc.CommentId = c.CommentId
WHERE
    c.OwnerId = 1

残念ながら、それはデータが前に追加されたすべての行を返しCommentsContentますComments

次の出力を探しています。

 CommentId  AuthorId  ParentId  Created              Updated              Content
 -------------------------------------------------------------------------------------
         1         2         0  2013-01-31 01:23:45  2013-01-31 01:23:47  Testing123
         2         2         0  2013-01-31 01:23:45  2013-01-31 01:23:45  Another test

これは、ネストされた を埋め込むことなく、単一のクエリで可能ですかSELECT? GROUP句を使用する必要がありますか? GROUPただし、句のパフォーマンスが低いと聞いたことがあります。GROUP句を高速化するために追加の索引を作成する必要がありますか?

入力していただきありがとうございます!

4

1 に答える 1

1

残念ながら、MySQL には SQL Server などのウィンドウ機能がありません。したがって、これにはサブクエリを使用する必要があります。

SELECT
    c.CommentId,
    c.AuthorId,
    c.ParentId,
    c.Created,
    cc.Created as Updated,
    cc.Content
FROM Comments as c
JOIN CommentsContent as cc
  ON cc.CommentId = c.CommentId
INNER JOIN
(
  select max(created) MaxDate, commentid
  from CommentsContent
  group by commentid
) cc2
  on cc.created = cc2.maxdate
  and cc.commentid = cc2.commentid
WHERE c.OwnerId = 1

デモで SQL Fiddle を参照してください

于 2013-01-31T23:30:36.417 に答える