Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQL nhận tin nhắn cuối cùng từ / tới người dùng nhất định

Tôi đang sử dụng SQL Server 2008, bạn không cho biết bạn đang sử dụng cơ sở dữ liệu nào.

Từ thông tin bạn đã cung cấp, truy vấn của bạn có vẻ quá phức tạp đối với kết quả đầu ra mà bạn yêu cầu. Đây là một truy vấn đơn giản để nhận tất cả các thông báo liên quan đến người dùng 36:

SELECT  
       sender.msg_user_name AS sender_user_name
       ,recipient.msg_user_name AS recipient_user_name
       ,msg_date
       ,msg_text

FROM    
       dbo.Fed_Messages 

       INNER JOIN dbo.Fed_User AS sender 
       ON sender.msg_user_id = sender_user_id

       INNER JOIN dbo.Fed_User AS recipient 
       ON recipient.msg_user_id = recipient_user_id

WHERE   
       sender_user_id = 36
       OR recipient_user_id = 36

ORDER BY
       msg_date DESC

Tôi đã phải thay đổi một số tên trường vì trong SQL Server một số tên bạn đã chọn là các từ dành riêng.

SQL Fiddle: http://sqlfiddle.com/#!3/b8e88/1

CHỈNH SỬA: Bây giờ bạn đã thêm một số thông tin khác và hiển thị có một id trên bảng thông báo, bạn có thể sử dụng một cái gì đó như thế này (lưu ý:Tôi có SQL Server nên bạn có thể sẽ phải thay đổi truy vấn cho MySQL):

SELECT  sender.msg_user_name AS sender_user_name
       ,recipient.msg_user_name AS recipient_user_name
       ,msg_date
       ,msg_text
FROM    dbo.Fed_Messages
        INNER JOIN dbo.Fed_User AS sender ON sender.msg_user_id = sender_user_id
        INNER JOIN dbo.Fed_User AS recipient ON recipient.msg_user_id = recipient_user_id
        INNER JOIN ( SELECT MAX(id) AS most_recent_message_id
                     FROM   dbo.Fed_Messages
                     GROUP BY CASE WHEN sender_user_id > recipient_user_id
                                   THEN recipient_user_id
                                   ELSE sender_user_id
                              END -- low_id
                           ,CASE WHEN sender_user_id < recipient_user_id
                                 THEN recipient_user_id
                                 ELSE sender_user_id
                            END -- high_id
                   ) T ON T.most_recent_message_id = dbo.Fed_Messages.id
WHERE   sender_user_id = 36
        OR recipient_user_id = 36
ORDER BY msg_date DESC

SELECT trong FROM một phần của truy vấn tìm thông báo gần đây nhất (dựa trên id , Tôi giả sử đó là một số tự động tăng dần) cho mỗi cặp id người dùng người gửi / người nhận có thứ tự. Kết quả của việc đó được liên kết lại với Fed_Messages để đảm bảo chúng tôi nhận được tên cho người gửi / người nhận chính xác.

Cập nhật SQL Fiddle: http://sqlfiddle.com/#!3/1f07a/2




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php xóa các hàng liên kết khỏi cơ sở dữ liệu mysql

  2. MySQL JOIN để thay thế các ID bằng giá trị từ một bảng khác

  3. sql tham gia dưới dạng biểu đồ venn

  4. Tôi có phải sử dụng mysql_real_escape_string nếu tôi ràng buộc các tham số không?

  5. mysql CHỈ THAY THẾ VÀO một số trường