順方向か逆方向かに関係なく、すべてのペアを取得する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;
これが