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()を呼び出すことによるパフォーマンスの低下なしにこれを実行できますが、適切なインデックスがあれば、これはそれほど問題にはなりません...

    更新

    投稿のないスレッドとスレッドのないフォーラムを含める最も簡潔な方法は、内部結合の代わりに左結合を使用することです。

    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. 転送中のMySQLデータのSSLキー管理と暗号化

    2. WooCommerceで変動する商品価格を変更するMySQLクエリ

    3. MySQLはどの通信プロトコルを使用しますか?

    4. 配列とそのキーをデータベースに保存する効率的な方法