sql >> Database >  >> RDS >> Mysql

SQL:Selecteer de laatste thread en laatste post, gegroepeerd op forum, gerangschikt op laatste post

Aangezien MySQL geen vensterfuncties ondersteunt, denk ik niet dat er een manier is om dit te doen zonder een 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

Als u de laatste resultaten in de cache plaatst, kunt u dit natuurlijk doen zonder de prestatievermindering van het aanroepen van MAX(), maar met de juiste indices zou dit niet zo'n probleem moeten zijn...

UPDATE

De meest beknopte manier om threads zonder berichten en forums zonder threads op te nemen, is door LEFT JOINs te gebruiken in plaats van 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. Voer 2 sql-query's uit met 1 query om het queryresultaat op te slaan als .csv-indeling

  2. php-gegevens uit database worden niet weergegeven na zoeken

  3. Waarom worden opgeslagen procedures nog steeds niet ondersteund in Rails (3+)?

  4. Deadlocks diagnosticeren in SQL Server 2005