2009-04-29 8 views
1

2つのテーブルがあるとします。投稿とコメント。投稿には多くのコメントがあります。ポストごとのコメントの数が変わるように、それらはいくらか満たされているようなふりをする。私はすべての投稿を取得するクエリが必要ですが、投稿ごとに最新のコメントのみが必要です。SQLクエリ質問:Xには多くのYがあります。すべてのXを取得し、Xごとに最新のYを取得します。

私はジョインとサブクエリに向けられていますが、私はそれを理解できません。

出力例:

POST1: コメント2

POST3(POST2ための最新): コメント10(POST3ための最新)

Comment4

POST2(POST1のための最新)

など...

ご協力いただければ幸いです。ありがとう。

答えて

3

この回答は、コメントごとに一意の識別子があり、番号が増加していることを前提としています。つまり、後の投稿は以前の投稿よりも数字が高い。シーケンシャルである必要はなく、入力の順番に対応する必要があります。

まず、投稿IDでグループ化された最大のコメントIDを抽出するクエリを実行します。

このような何か:

SELECT MAX(ID) MaxCommentID, PostID 
FROM Comments 
GROUP BY PostID 

これはあなたのポストのidの、各1の最高(最新)コメントIDのリストが表示されます。

次に、これらのIDについて、コメントから残りのデータを抽出するためにこれに参加します。

SELECT C1.*, C2.PostID 
FROM Comments AS C1 
    INNER JOIN (
     SELECT MAX(ID) MaxCommentID, PostID 
     FROM Comments 
     GROUP BY PostID 
    ) AS C2 ON C1.CommentID = C2.MaxCommentID 

次に、これらの投稿に関する情報を得るために投稿に参加します。

SELECT C1.*, P.* 
FROM Comments AS C1 
    INNER JOIN (
     SELECT MAX(ID) MaxCommentID, PostID 
     FROM Comments 
     GROUP BY PostID 
    ) AS C2 ON C1.CommentID = C2.MaxCommentID 
    INNER JOIN Posts AS P ON C2.PostID = P.ID 

別のアプローチは、すべての内側のクエリのPostIDを使用しません。最初に、すべてのユニークな投稿の最大のコメントIDを選んでください。ただし、どの投稿がユニークであるかを気にしません。

SELECT MAX(ID) AS MaxCommentID 
FROM Comments 
GROUP BY PostID 

そして、それらのコメントのために残りのデータを取得するには、IN句を実行します。

SELECT C1.* 
FROM Comments 
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID 
    FROM Comments 
    GROUP BY PostID 
) 
次に単にポストに参加

SELECT C1.*, P.* 
FROM Comments AS C1 
    INNER JOIN Posts AS P ON C1.PostID = P.ID 
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID 
    FROM Comments 
    GROUP BY PostID 
) 
0

は、から最新のコメントを選択サブクエリ

e。グラム

Select * 
from Posts po 
Inner Join 
(
Select CommentThread, CommentDate, CommentBody, Post from comments a 
inner join 
(select commentthread, max(commentdate) 
from comments b 
group by commentthread) 
on a.commentthread = b.commentthread 
and a.commentdate = b.commentdate 
) co 
on po.Post = co.post 
+0

投稿が必然的にコメントを使用している場合は左外部結合を使用していない場合は投稿とコメントの間に内部結合 – u07ch

0
select * 
    from post 
     , comments 
    where post.post_id = comments.post_id 
    and comments.comments_id = (select max(z.comments_id) from comments z where z.post_id = post.post_id) 
0

そして、あなたはまだ、あなたが

SELECT 
    p.id, c1.id 
FROM 
    posts as p 
LEFT JOIN 
    comments as c1 
ON 
    p.id = c1.postId 
LEFT JOIN 
    comments as c2 
ON 
    c1.postId = c2.postId 
    AND c1.id < c2.id 
WHERE 
    isnull(c2.id) 
ORDER BY 
    p.id
のようなものいずれかの方法で使用することができますサブクエリを知っているパフォーマンスの問題のために EXPLAINでクエリをチェックしていない古いMySQLバージョン、で立ち往生する必要がある場合。

関連する問題