Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL:Pilih utas terbaru dan posting terbaru, dikelompokkan berdasarkan forum, diurutkan berdasarkan posting terbaru

Karena MySQL tidak mendukung fungsi jendela, saya rasa tidak ada cara untuk melakukan ini tanpa subquery:

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

Secara alami, cache hasil terbaru akan memungkinkan Anda melakukan ini tanpa penalti kinerja memanggil MAX(), tetapi dengan indeks yang tepat, ini seharusnya tidak menjadi masalah...

PERBARUI

Cara paling ringkas untuk memasukkan utas tanpa posting dan forum tanpa utas adalah dengan menggunakan LEFT JOIN daripada INNER JOIN:

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. Bagaimana memulihkan database MySQL dari file .myd, .myi, .frm

  2. persimpangan banyak-ke-banyak dan banyak-ke-banyak

  3. mysqli_query() mengharapkan setidaknya 2 parameter, 1 diberikan?

  4. Mengubah MySQL ke MS Access

  5. Bagaimana cara menghasilkan cuplikan seperti yang dihasilkan oleh Google dengan PHP dan MySQL?