Une option pour obtenir toutes les paires, qu'elles soient en avant ou en arrière (par exemple (1, 2) ==(2, 1)) est de sélectionner le LEAST()
et GREATEST()
de chaque ligne, puis sélectionnez des valeurs distinctes. Utilisation de cette requête :
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
Vous obtiendrez le résultat suivant :
| 1 | 2 |
| 1 | 3 |
Une fois que vous avez cela, vous pouvez GROUPER par ceux-ci pour obtenir la date maximale pour chaque paire :
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);
Cette requête vous donnera les données dont vous avez besoin pour chaque paire, mais elle ne renverra pas la ligne réelle de votre table d'origine. S'il y a une ligne de format | 2 | 1 | 2014-10-15 |
cette requête retournera | 1 | 2 | 2014-10-15
.
Pour obtenir la ligne d'origine de votre table, vous devez JOIN
à condition que toutes les colonnes nécessaires correspondent :
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;
Voici un SQL Fiddle exemple qui correspond aux résultats attendus.