sql >> データベース >  >> RDS >> Mysql

DISTINCT ON query w /ORDERBY列の最大値

    それは簡単でしょう。 max()は必要ありません また、DISTINCT このために:

    SELECT *
    FROM   profile_visits
    WHERE  social_user_id = 21
    AND    created_at > (now() - interval '2 months')
    AND    visitor_id <> 21  -- ??
    ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
    LIMIT  6;
    

    あなたの質問は不完全だと思います。必要に応じて:
    ページに最後にアクセスした6人の最新の訪問者
    次に、サブクエリが必要です。 DISTINCT ONでも、1つのクエリレベルでこの並べ替え順序を取得することはできません。 、またはウィンドウ関数を使用する場合:

    SELECT *
    FROM  (
       SELECT DISTINCT ON (visitor_id) *
       FROM   profile_visits
       WHERE  social_user_id = 21
       AND    created_at > (now() - interval '2 months')
       AND    visitor_id <> 21  -- ??
       ORDER  BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
       ) sub
    ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
    LIMIT  6;
    

    サブクエリsub ユーザーごとに最新の訪問を取得します(ただし、2か月以内で、特定の訪問者の場合は取得しません21ORDER BY DISTINCT ONと同じ先頭の列が必要です 。

    次に、6人の最新の訪問者を取得するには、外部クエリが必要です。
    イベントのシーケンスを検討してください:

    なぜNULLS LAST ?確かに、テーブル定義を提供していません。




    1. 無効なキャスト例外が処理されなかったMySQL

    2. 001から始まる自動生成されたシーケンス番号(3桁のみ)-PHP / MYSQL

    3. mysqlで列の名前を変更するのになぜこれほど時間がかかるのですか?

    4. MariaDBでのFROM_BASE64()のしくみ