2011-12-19 51 views
8

Tôi có một tuyên bố mysqlMySQL chọn GROUP BY để

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

và nó được sản xuất kết quả chính xác tuy nhiên họ không theo đúng thứ tự.

Tính năng nhóm hoạt động tốt nhưng bản ghi được hiển thị trong nhóm là bản ghi đầu tiên được nhập vào DB nhưng tôi muốn bản ghi mới nhất được hiển thị trong mỗi nhóm.

Có cách nào để có bản ghi mới nhất được hiển thị cho mỗi nhóm không?

2011-12-19 12:16:25 This is the first message 
2011-12-19 12:18:20 This is the second message 
2011-12-19 12:43:04 This is the third message 

Nhóm hiển thị 'Đây là thư đầu tiên' mà tôi muốn 'Đây là thư thứ ba' vì đó là bản ghi/thư gần đây nhất.

Cheers

+0

Truy vấn phải hiển thị là gì? –

+0

Nếu bạn chỉ cần hai cột (ví dụ: ID và dấu thời gian mới nhất của nó), điều này có thể hoạt động: http://stackoverflow.com/a/4448536/722036. Đó là ** nhanh hơn ** so với sử dụng truy vấn phụ trên một bảng lớn với hàng triệu hàng. –

Trả lời

9

này có thể làm việc (nhưng không được bảo đảm):

SELECT * 
FROM 
    (SELECT * 
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC 
) tmp 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

này nên làm việc:

SELECT t.* 
FROM 
    tbl_messages AS t 
    JOIN 
    (SELECT from_user_id 
      , MAX(date_sent) AS max_date_sent 
     FROM tbl_messages 
     WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
     GROUP BY from_user_id 
    ) AS tg 
    ON (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent) 
ORDER BY t.date_sent DESC 
+0

Điều này dường như đang hoạt động. Một sửa đổi nhỏ cần thiết (thêm tbl_messages trước khi GROUP BY) nhưng có vẻ tốt. Cảm ơn! – puks1978

+0

Cảm ơn đã cứu ngày của tôi, ở trường tôi đã tìm hiểu thêm về truy vấn phụ ... Tôi không nhớ truy vấn tuyệt vời này ... giáo viên của tôi ... những kỷ niệm cũ – delive

-1

Bạn có nghĩa là một cái gì đó như thế này:

 
SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC 

2

Nếu tin nhắn của bạn bảng có khóa chính đó là tính năng tự động tăng, và tất cả thư là do bản chất số cao nhất là ngày gần đây nhất ... Tuy nhiên, vì tôi không BIẾT rằng, tôi sẽ dựa trên MAX (date_sent) thay vì max (SomeIDKey), nhưng nguyên tắc là như nhau.

select 
     tm2.* 
    from 
     (select tm1.from_user_id, 
       max(tm1.date_sent) LatestMsgDate 
      from tbl_messages tm1 
      group by tm1.from_user_id) MaxPerUser 

     left join tbl_messages tm2 
     on MaxPerUser.From_User_ID = tm2.From_User_ID 
     AND MaxPerUser.LatestMsgDat = tm2.Date_Sent 

    order by 
     date_sent DESC 
+0

Tôi làm cách nào để thêm ORDER BY trong MaxPerUser và GROUP BY vào cuối truy vấn. –

+1

@MohammedAbrarAhmed, không có thứ tự bằng cách áp dụng cho truy vấn MaxPerUser bên trong. Tuy nhiên, nếu bạn muốn kết quả bên ngoài của bạn dựa trên ngày tin nhắn gần đây nhất, bạn có thể ORDER BY MaxPerUser.LatestMsgDate - nếu đó là những gì bạn đang xem xét để có các thông điệp mới nhất nổi lên trên cùng. – DRapp

8

Làm một GROUP BY sau ORDER BY bằng cách gói truy vấn của bạn với GROUP BY như thế này:

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from 
+0

Ngay cả khi tôi đặt ASC trong truy vấn "t" lấy DESC của nó. –