Mysql
 sql >> Base de données >  >> RDS >> Mysql

Combinaison unique de deux colonnes dans mysql ou postgres

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.