Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Помогите составить SQL-запрос (https://javascript.ru/forum/server/44705-pomogite-sostavit-sql-zapros.html)

VladShestakov999 29.01.2014 22:17

Помогите составить 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

ksa 29.01.2014 22:55

Цитата:

Сообщение от VladShestakov999
а мой собеседник уникален."

Это не совсем понятно...
В твоем пример только 3 участника и каждый человек уникален по определению. Т.е. клонов у нас вроде как нет.

Цитата:

Сообщение от VladShestakov999
Например, если таблица заполнена так:

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

Могу предположить, что нужны только уникальные пары from + to...
Но опять не понятно:
- сохраняется ли твоя "уникальность" в симметрии Я+ОН и ОН+Я
- если нужны только "уникальные" - условие "по одному последнему сообщению" вообще лишено смысла

VladShestakov999 29.01.2014 23:00

Или лучше так: "Дай мне по одному последнему сообщению, во всех переписках со мной." (независимо кто отправлял или получал последнее сообщение). В общем как в социальных сетях -- например ВК ты открываешь страницу "Мои сообщения" и тебе выползают все диалоги и по одному последнему сообщению из них, вот мне нужно то же самое. (То есть последнее сообщение)

ksa 29.01.2014 23:01

Цитата:

Сообщение от VladShestakov999
Дай мне по одному последнему сообщению, в переписке двух людей.

Это уже другое дело. :yes:

ksa 29.01.2014 23:10

VladShestakov999, как вариант:
- сделать фиктивный столбец "участники"
- останется только найти записи участников с максимальной датой

ksa 29.01.2014 23:15

Сейчас нет СУБДшки под рукой... :( Т.ч. пока только на словах...

VladShestakov999 29.01.2014 23:15

Спасибо! Натолкнул на идею. Сделаю так: чтобы не нарушать правила Эдгара Кодда, я создам таблицу dialogs вида:

id int(10) UNSIGNED
firstmem varchar(11)
secondmem varchar(11)

А вместо to и from в таблице сообщений буду хранить поле did (Dialog id) и дальше по накатаной.

ksa 29.01.2014 23:25

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
			)
	)

kostyanet 02.02.2014 11:41

Цитата:

Сообщение от VladShestakov999
Выбери мне по одному последнему сообщению, где получатель или отправитель я, а мой собеседник уникален."


select * from сообщения where получатель = я and отправитель = я and дата=последняя group by собеседник

ksa 02.02.2014 14:39

Цитата:

Сообщение от kostyanet
получатель = я and отправитель = я

Ты сам-то понял, что написал? :D

kostyanet 07.02.2014 06:47

Главное что автор задачи понял, а до вас мне дела нет.


Часовой пояс GMT +3, время: 19:45.