SQL Query Frage: X X viele Y. Erhalten hat und nur den neuesten Y pro X erhalten
Frage
Angenommen, wir haben zwei Tabellen. Post und kommentieren. Post hat viele Kommentare. Behaupten sie etwas gefüllt werden, so dass die Anzahl der Kommentare pro Post variiert wird. Ich möchte eine Abfrage, die alle Beiträge greift, sondern nur den neuesten Kommentar per Post.
Ich habe gerichtet zu Joins und Unterabfragen, aber ich kann es nicht herausgefunden.
Ausgabe:
Post1: Comment4 (neueste für post1)
Post2: Comment2 (neueste für post2)
Post3: Anmerkung 10 (neueste für Post3)
etc ...
Jede Hilfe wäre sehr geschätzt. Danke.
Lösung
Diese Antwort wird davon ausgegangen, dass Sie eine eindeutige Kennung für jeden Kommentar haben, und dass es eine zunehmende Zahl. Das heißt, später Beiträge haben höhere Zahlen als die früheren Beiträge. Muss nicht sequentiell sein, nur werden müssen, entspricht der Eingang bestellen.
Erstens hat eine Abfrage, die den maximalen Kommentar-ID extrahiert, gruppierte nach Post-ID.
So etwas wie folgt aus:
SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID
Dies wird Ihnen eine Liste der Post-IDs und die höchste (neuesten) Kommentar-ID für jeden.
Dann verbinden Sie mit diesem, den Rest der Daten aus den Kommentaren zu extrahieren, für die ids.
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
Dann kommen Sie mit den Pfosten, die Informationen über diese Stellen zu erhalten.
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
Ein alternativer Ansatz die PostID der inneren Abfrage überhaupt nicht verwenden. auszusuchen Zuerst die maximale Kommentar-ID für alle einzigartigen Beiträge, aber egal, um welche Post, wir wissen, dass sie einzigartig.
SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID
Dann eine IN-Klausel tun, um den Rest der Daten für diese Äusserungen zu bekommen:
SELECT C1.*
FROM Comments
WHERE C1.ID IN (
SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID
)
Dann einfach in den Pfosten verbinden:
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
)
Andere Tipps
Wählen Sie den neuesten Kommentar aus einer Unterabfrage
z
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
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)
Und wenn Sie noch mit einer alten MySQL-Version gesteckt werden sollen, die nicht weiß, Subqueries Sie so etwas wie
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.idEither Art und Weise, überprüfen Sie die Abfrage mit EXPLAIN für Performance-Probleme.