Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL:Изберете най-новата тема и най-новата публикация, групирани по форум, подредени по последна публикация

Тъй като MySQL не поддържа прозоречни функции, не мисля, че има начин да направите това без подзаявка:

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

Естествено, кеширането на най-новите резултати ще ви позволи да направите това без загубата на производителност от извикването на MAX(), но с правилните индекси това не би трябвало да е голям проблем...

АКТУАЛИЗИРАНЕ

Най-сбитият начин за включване на нишките без публикации и форуми без нишки би бил да се използват LEFT JOIN вместо 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. MySQL на дублиран ключ... да получите съществуващ ID?

  2. MySQL таблица само с varchar като външен ключ

  3. Достъп до коментарите на полето MySQL с PHP

  4. MySQL заявка въз основа на въвеждане от потребителя

  5. MySQL Подреждане по номер, нула последни