Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL:Wählen Sie den neuesten Thread und den neuesten Beitrag, gruppiert nach Forum, geordnet nach dem neuesten Beitrag

Da MySQL keine Fensterfunktionen unterstützt, gibt es meines Erachtens keine Möglichkeit, dies ohne eine Unterabfrage zu tun:

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

Wenn Sie die neuesten Ergebnisse zwischenspeichern, können Sie dies natürlich ohne die Leistungseinbußen beim Aufrufen von MAX() tun, aber mit den richtigen Indizes sollte dies kein großes Problem darstellen ...

AKTUALISIEREN

Die prägnanteste Art, Threads ohne Beiträge und Foren ohne Threads einzubinden, wäre die Verwendung von LEFT JOINs anstelle von 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