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.

War es hilfreich?

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.id
Either Art und Weise, überprüfen Sie die Abfrage mit EXPLAIN für Performance-Probleme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top