Помогите составить SQL-запрос
Здравствуйте! Есть таблица:
id int(10) UNSIGNED from varchar(11) to varchar(11) text text seen tinyint(1) time varchar(25) Где from и to это идентификаторы получателя и отправителя сообщения, text - содержание, seen - было ли прочитано сообщение, time - время отправки в формате TIMESTAMP. Теперь нужно составить такой запрос: "Выбери мне по одному последнему сообщению, где получатель или отправитель я, а мой собеседник уникален." Например, если таблица заполнена так: id from to text seen time 9 9 13 Здарова 0 20140129184307 10 9 11 Есть... 0 20140129185828 11 9 11 Как сам? 0 20140129190121 13 11 9 Да, лови 0 20140129192328 То результат должен быть следующим: id from to text seen time 9 9 13 Здарова 0 20140129184307 13 11 9 Да, лови 0 20140129192328 |
Цитата:
В твоем пример только 3 участника и каждый человек уникален по определению. Т.е. клонов у нас вроде как нет. Цитата:
Но опять не понятно: - сохраняется ли твоя "уникальность" в симметрии Я+ОН и ОН+Я - если нужны только "уникальные" - условие "по одному последнему сообщению" вообще лишено смысла |
Или лучше так: "Дай мне по одному последнему сообщению, во всех переписках со мной." (независимо кто отправлял или получал последнее сообщение). В общем как в социальных сетях -- например ВК ты открываешь страницу "Мои сообщения" и тебе выползают все диалоги и по одному последнему сообщению из них, вот мне нужно то же самое. (То есть последнее сообщение)
|
Цитата:
|
VladShestakov999, как вариант:
- сделать фиктивный столбец "участники" - останется только найти записи участников с максимальной датой |
Сейчас нет СУБДшки под рукой... :( Т.ч. пока только на словах...
|
Спасибо! Натолкнул на идею. Сделаю так: чтобы не нарушать правила Эдгара Кодда, я создам таблицу dialogs вида:
id int(10) UNSIGNED firstmem varchar(11) secondmem varchar(11) А вместо to и from в таблице сообщений буду хранить поле did (Dialog id) и дальше по накатаной. |
VladShestakov999, по первому варианту таблички можно вот такой запрос попробовать
Select * From table as a Where a.time=( Select max(b.time) From table as b Where ( b.from=a.from and b.to=a.to ) Or ( b.from=a.to and b.to=a.from ) ) |
Цитата:
select * from сообщения where получатель = я and отправитель = я and дата=последняя group by собеседник |
Цитата:
|
Главное что автор задачи понял, а до вас мне дела нет.
|
Часовой пояс GMT +3, время: 19:45. |