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

mysqlまたはpostgresの2つの列の一意の組み合わせ

    順方向か逆方向かに関係なく、すべてのペアを取得する1つのオプション(たとえば、(1、2)==(2、1))は、LEAST()を選択することです。 およびGREATEST() 各行から、個別の値を選択します。このクエリの使用:

    SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
    FROM myTable;
    

    次の出力が得られます:

    | 1 | 2 |
    | 1 | 3 |
    

    それができたら、これらでグループ化して、各ペアの最大日付を取得できます。

    SELECT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id), MAX(created_at)
    FROM myTable
    GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id);
    

    このクエリは、各ペアに必要なデータを提供しますが、元のテーブルから実際の行を返すことはありません。フォーマット| 2 | 1 | 2014-10-15 | このクエリは| 1 | 2 | 2014-10-15

    テーブルから元の行を取得するには、JOINする必要があります 必要なすべての列が一致することを条件に:

    SELECT m.*
    FROM myTable m
    JOIN(
      SELECT LEAST(sender_id, recipient_id) AS least, 
        GREATEST(sender_id, recipient_id) AS greatest,
        MAX(created_at) AS maxDate
      FROM myTable
      GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)) tmp
    ON tmp.least = LEAST(m.sender_id, m.recipient_id) AND tmp.greatest = GREATEST(m.sender_id, m.recipient_id) AND tmp.maxDate = m.created_at;
    

    これが SQLFiddle です。 期待する結果に一致する例。



    1. SQL Server:動的なwhere句

    2. プロアクティブなデータベースパフォーマンスモニタリングの5つの利点

    3. ユーザー名が存在するかどうかを確認するPDO

    4. SQLServer2019でのスカラーUDFインライン化