2012-02-25 35 views
6

Tôi có trang web mạng xã hội và đang đấu tranh với truy vấn. Tôi có một bảng bài viết chứa tất cả các bài viết của người dùng và sau đó một bảng post_comments chứa tất cả các nhận xét trên một bài đăng. Tôi đang cố gắng tìm nhận xét mới nhất của bài đăng từ bảng post_comments. Bảng post_comments có các cột sau:MySQL truy xuất hồ sơ mới nhất cho Nhóm

post_comment_id, post_id, writer_user_id, post_comment_content, datetime

Tôi đã nhóm lại kết quả theo post_id như vậy:

SELECT * FROM post_comments GROUP BY post_id 

này gần như làm những gì Tôi muốn nhưng nó luôn luôn trả về bình luận cũ nhất cho mỗi bài viết không phải là mới nhất. Làm thế nào tôi có thể làm cho nó trở lại bình luận mới nhất cho mỗi bài viết?

+0

Câu trả lời từ @alexis là tốt nhất ... bạn nên đánh dấu câu trả lời là chấp nhận để câu hỏi này không hiển thị trên danh sách "chưa được trả lời". –

Trả lời

-3

Đã sắp xếp! Tôi đã làm như sau:

SELECT * FROM (
    SELECT * FROM post_comments ORDER BY datetime DESC 
) AS post_comments 
GROUP BY post_id 
16

GROUP BY được dự định sẽ được sử dụng với chức năng tổng hợp, nếu không tùy ý chọn một hàng cho mỗi nhóm. Giải pháp của bạn (ở trên và trong câu trả lời của bạn) hoạt động vì MySQL dường như đang giữ hàng đầu tiên của mỗi nhóm, nhưng bạn không chắc chắn rằng điều này sẽ luôn luôn xảy ra.

Bạn có thể nhận được ngày nhận xét mới nhất cho mỗi post_id như thế này.

select post_id, MAX(datetime) as latest from post_comments group by post_id 

Sử dụng nó để chọn bình luận mới nhất:

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 
+1

Đây là một cách chính xác để xử lý truy vấn đó. –

2

Như rất nhiều câu hỏi đến với "Tôi muốn sự xâm nhập mới nhất cho ...", và có một số thời gian ngày. Nếu bảng được đề cập là tự động gia tăng và dấu ngày/giờ sẽ luôn ở trong tương quan thời gian tuần tự ... nghĩa là: người dùng không có cơ hội chỉnh sửa hoặc thay đổi dấu thời gian trên bản ghi để đặt mục nhập ngày hôm nay với ngày của 3 tuần trước ... rất nhiều người sẽ tiếp tục cố gắng để có được ngày cuối cùng đó và tham gia lại vào một khóa không có lợi thế. Chỉ cần lấy khóa ID tối đa cho bài đăng và sử dụng nó ... Tôi sẽ có chỉ mục trên ID bài đăng và khóa tự động tăng chính.

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 
+0

Điều này có thể không hoạt động trong một số trường hợp nhất định như Nhân bản kép. –

+0

@ypercube, không quen thuộc với thuật ngữ đó, và nhìn vào nó, bạn là chính xác và thay thế "theo ngày" sẽ là cách tiếp cận tốt hơn. – DRapp

+0

Tôi không chắc chắn nếu có một cơ hội mà các đơn đặt hàng khác nhau sẽ xảy ra với một máy chủ, nếu có nhiều kết nối chèn dữ liệu. Có lẽ không phải với dấu thời gian, có thể có với thời gian biểu được cung cấp bởi các ứng dụng (có thể có đồng hồ không đồng bộ hoàn hảo). Dù sao, câu trả lời của bạn là tốt cho một máy chủ (mặc dù có thể không cho kết quả chính xác 100%). Nếu hiệu quả quan trọng (và chúng tôi không thể thêm các chỉ mục bổ sung vào cột ngày giờ), đây có lẽ là truy vấn tốt nhất để sử dụng. –

Các vấn đề liên quan