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

SQL:Chọn chủ đề mới nhất và bài đăng mới nhất, được nhóm theo diễn đàn, sắp xếp theo bài đăng mới nhất

Vì MySQL không hỗ trợ các hàm cửa sổ nên tôi không nghĩ có cách nào để thực hiện việc này mà không cần truy vấn con:

SELECT  f.id AS forum_id,
    f.name AS forum_name,
    t.id AS thread_id,
    t.topic AS thread_topic,
    t.ts AS thread_timestamp,
    p.id AS post_id,
    p.content AS post_content,
    p.ts AS post_timestamp

FROM   forums f
JOIN (SELECT t2.forum_id, max(p2.ts) as ts
      FROM posts p2
      JOIN threads t2 ON p2.thread_id = t2.id
      GROUP BY t2.forum_id) max_p ON f.id = max_p.forum_id
JOIN   posts p ON max_p.ts = p.ts
JOIN   threads t ON f.id = t.forum_id AND p.thread_id = t.id
ORDER BY p.ts

Đương nhiên, vào bộ nhớ đệm các kết quả mới nhất sẽ cho phép bạn thực hiện điều này mà không bị phạt hiệu suất khi gọi MAX (), nhưng với các chỉ số phù hợp, điều này không có nhiều vấn đề ...

CẬP NHẬT

Cách ngắn gọn nhất để bao gồm các chủ đề không có bài đăng và diễn đàn không có chủ đề là sử dụng LEFT JOIN thay vì INNER JOINs:

SELECT  f.id AS forum_id,
    f.name AS forum_name,
    t.id AS thread_id,
    t.topic AS thread_topic,
    t.ts AS thread_timestamp,
    p.id AS post_id,
    p.content AS post_content,
    p.ts AS post_timestamp

FROM   forums f
LEFT JOIN (SELECT t2.forum_id, max(COALESCE(p2.ts, t2.ts)) as ts, COUNT(p2.ts) as post_count
      FROM threads t2 
      LEFT JOIN posts p2 ON p2.thread_id = t2.id
      GROUP BY t2.forum_id) max_p ON f.id = max_p.forum_id
LEFT JOIN   posts p ON max_p.ts = p.ts
LEFT JOIN   threads t ON f.id = t.forum_id AND (max_p.post_count = 0 OR p.thread_id = t.id)
ORDER BY p.ts


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể kết nối Google Cloud SQL trong MySql Workbench

  2. Khung thực thể với mysql, Vấn đề viết hoa bảng giữa linux và windows

  3. IMAP &PHP - Tìm nạp tất cả email từ các thư mục đã gửi và hộp thư đến

  4. MySQL Select:WHERE (time now) =GIỮA giá trị bảng VÀ giá trị bảng

  5. truy xuất và in các giá trị sau dấu phân tách bằng dấu phẩy từ một trường duy nhất bằng cách sử dụng phép nối (bộ mã)