Една опция за получаване на всички двойки, независимо дали са напред или назад (например (1, 2) ==(2, 1)) е да изберете LEAST()
и GREATEST()
от всеки ред и след това изберете отделни стойности. С помощта на тази заявка:
ИЗБЕРЕТЕ РАЗЛИЧНИ НАЙ-МАЛКИ(идентификатор на подател, идентификатор_на_получател), НАЙ-ГОЛЯМ(идентификатор на подател, идентификатор_на_получател)ОТ myTable;
Ще получите следния резултат:
<предварителен код>| 1 | 2 || 1 | 3 |След като имате това, можете да ГРУПИРАТЕ по тези, за да получите максималната дата за всяка двойка:
SELECT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id), MAX(created_at)FROM myTableGROUP BY LEST(sender_id, recipient_id), GREATEST(sender_id, recipient_id);
Тази заявка ще ви даде данните, от които се нуждаете за всяка двойка, но няма да върне действителния ред от оригиналната ви таблица. Ако има ред във формат | 2 | 1 | 2014-10-15 |
тази заявка ще върне | 1 | 2 | 2014-10-15
.
За да получите оригиналния ред от вашата таблица, трябва да JOIN
при условие, че всички необходими колони съвпадат:
SELECT m.*FROM myTable mJOIN( SELECT LEAST(sender_id, recipient_id) AS small, GREATEST(sender_id, recipient_id) AS greatest, MAX(created_at) AS maxDate FROM myTable GROUP BY LEST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)) tmpON tmp.least =LEAST(m.sender_id, m.recipient_id) И tmp.greatest =GREATEST(m.sender_id, m.recipient_id) И tmp.maxDate =m.created_at;
Ето един SQL Fiddle пример, който отговаря на вашите очаквани резултати.