sql >> Databasteknik >  >> RDS >> Mysql

SQL:Välj senaste tråden och senaste inlägget, grupperat efter forum, sorterat efter senaste inlägget

Eftersom MySQL inte stöder fönsterfunktioner, tror jag inte att det finns något sätt att göra detta utan en underfråga:

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

Naturligtvis skulle cachelagring av de senaste resultaten låta dig göra detta utan prestationsstraffet att anropa MAX(), men med rätt index borde detta inte vara något problem...

UPPDATERA

Det mest kortfattade sättet att inkludera trådar utan inlägg och forum utan trådar skulle vara att använda LEFT JOINs istället för 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. SQL Server-replikering kräver det faktiska servernamnet för att göra en anslutning till servern

  2. Lagra UUID v4 i MySQL

  3. Typinitieringsprogrammet för 'System.Data.Entity.Migrations.DbMigrationsConfiguration'1' gav ett undantag

  4. mysql multipla frågor i ett uttalande