@Gildars

Как объединить результаты запроса MySQL исключив дубликацию результатов?

Есть запрос:
SELECT DISTINCT * FROM Aincrad\Models\Messages
 WHERE author = :author: OR recipient = :author: 
GROUP BY author,recipient ORDER BY id DESC",
 array(
'author' => $auth['login'],
 'recipient' => $auth['login']
)
);

Результаты выполнения запроса (если переменная $auth['login'] = 'Gildars')
d29a3647085c4d398846db306e7a8d08.png
Я делаю список активных диалогов пользователя, и мне нужно написать запрос который вернет последнее сообщение из переписки двух пользователей, но на скриншоте видно что в результатах выборки есть ДВЕ записи с переписки двух пользователей 'Gildars' и 'Haruka', а мне нужна только одна запись их переписки.
Помогите! Как исключить подобные дубликации?
  • Вопрос задан
  • 501 просмотр
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Общие советы:

Во первых, почитайте как работает DISTINCT - он тут совершенно не при чем.

Во вторых, категорически не рекомендую использовать запрос GROUP BY с указанием в select полей которые не участвуют в группировке / не обработаны агрегирующими функциями. Строго говоря содержимое таких полей может быть достаточно произвольным + на правильно сконфигурированном sql будет ошибка синтаксиса.

Конкретные советы:
Либо получать вложенным запросом типа
select tmp.*, Aincrad\Models\Messages.message
FROM (
  select author, recipient, max(id) as maxid
  from Aincrad\Models\Messages msg
) tmp
join Aincrad\Models\Messages on Aincrad\Models\Messages.id = tmp.maxid
что будет весьма медленно, либо создать еще одну таблицу в которой явно хранить именно последнее сообщение диалога.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@springimport
Не понял почему не должно быть повторов в вашей задаче. Это же не повторы, а элементы перепискии. Что мешает указать ORDER BY id DESC LIMIT 1?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы