sql >> Database teknologi >  >> RDS >> Mysql

SQL:Vælg seneste tråd og seneste indlæg, grupperet efter forum, sorteret efter seneste indlæg

Da MySQL ikke understøtter vinduesfunktioner, tror jeg ikke, der er nogen måde at gøre dette på uden en underforespørgsel:

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

Naturligvis ville cachelagring af de seneste resultater lade dig gøre dette uden ydeevnestraffen ved at kalde MAX(), men med de rigtige indekser burde dette ikke være det store problem...

OPDATERING

Den mest kortfattede måde at inkludere tråde uden indlæg og fora uden tråde på ville være at bruge LEFT JOINs i stedet for et 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. Mysql:Rækkefølgen af ​​resultater med vælg <feltnavn> fra er forskellig fra rækkefølgen af ​​resultater med vælg * fra

  2. Ydeevnestraf for indlejrede mysql-forespørgsler

  3. Er det muligt at søge efter hele givet ord i fuldtekstsøgning i mysql

  4. Sådan får du det korte månedsnavn fra en dato i MariaDB