问题
I have a social networking site and am struggling with a query. I have a posts table that holds all of the users posts and then a post_comments table that holds all comments on a post. I am trying to find the latest comment by post from post_comments table. The post_comments table has the following columns:
post_comment_id, post_id, writer_user_id, post_comment_content, datetime
I have grouped the results by post_id like so:
SELECT * FROM post_comments GROUP BY post_id
This almost does what I want but it always returns the oldest comment for each post not the newest one. How can I get it to return the newest comment for each post?
回答1:
GROUP BY is intended to be used with aggregating functions, otherwise it arbitrarily selects one row per group. Your solution (above and in your self-answer) works because MySQL seems to be keeping the first row of each group, but you're not guaranteed that this will always happen.
You can get the date of the latest comment for each post_id
like this.
select post_id, MAX(datetime) as latest from post_comments group by post_id
Use it to select the latest comment:
SELECT t1.* FROM post_comments AS t1
JOIN (
SELECT post_id, MAX(datetime) AS latest FROM post_comments GROUP BY post_id
) AS t2
ON t1.post_id = t2.post_id AND t1.datetime = t2.latest
回答2:
As so many questions come in with "I want the latest entry for...", and have some date time. If the table in question is auto-increment, and the date/time stamp will ALWAYS stay in sequential time correlation ... i.e.: the user has no chance to edit or otherwise change the timestamp on the record to put today's entry with a date of 3 weeks ago... so many will keep trying to get that last date and re-join on a non-advantaged key. Just get the maximum ID key for the post and use that... I would have an index on the post ID and the primary auto-increment key.
select
P2.*
from
( select post_id, max( post_comment_id ) as LastPost
from post_comments
group by post_id ) LastPerPost
JOIN post_comments P2
on LastPerPost.LastPost = P2.post_comment_id
回答3:
Sorted it! I did it like this:
SELECT * FROM (
SELECT * FROM post_comments ORDER BY datetime DESC
) AS post_comments
GROUP BY post_id
来源:https://stackoverflow.com/questions/9444167/mysql-retrieve-latest-record-for-group