Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL:Wybierz najnowszy wątek i najnowszy post, pogrupowane według forum, uporządkowane według najnowszego posta

Ponieważ MySQL nie obsługuje funkcji okien, nie sądzę, aby można było to zrobić bez podzapytania:

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

Oczywiście, buforowanie najnowszych wyników pozwoliłoby to zrobić bez spadku wydajności wywołanego wywołaniem funkcji MAX(), ale przy odpowiednich indeksach nie powinno to stanowić większego problemu...

AKTUALIZUJ

Najbardziej zwięzłym sposobem włączenia wątków bez postów i forów bez wątków byłoby użycie LEFT JOIN zamiast 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. Co to jest schemat bazy danych?

  2. MySQL ::Uruchom instrukcję SQL w zmiennej

  3. Wzorzec połączenia z bazą danych PHP singleton

  4. Bawić się! Framework 1.2.4 --- Ustawienia C3P0, aby uniknąć awarii łącza komunikacyjnego do czasu bezczynności

  5. Class.forName(com.mysql.jdbc.Driver).newInstance()