Leonid
PHP? нет, не слышал...
Есть таблица messages сообщений между пользователями сайта. Нужно для какого-либо пользователя, например с Id= 100
сделать список его собеседников, отсортированный по дате последнего сообщения.
таблица messages:
Вначале нужно сделать выборку всех пользователей,
а) для которых есть сообщение от него
б) от которых есть сообщение для него
в) отсортированных по дате
вроде просто:
select * from messages where from_user = 100 or to_user = 100 order by date_time desc
имеем:
усложняем задачу. Поскольку нам нужен не список сообщений, а список пользователей, с которыми есть переписка, нам нужно получить
только по одной записи, в которой есть сообщение от или к другому пользователю.
Если сделать select distinct from_user или select distinct to_user, то не всегда получим полную выборку собеседников
Пришла мысль сделать так: с помощью логических функций при выборке формируется дополнительное поле sobesednik, равное
либо from_user (если from_user <> 100) либо to_user (Если to_user <> 100) и делать distinct по нему:
Без distinct выборка будет такой
а с distinct по логике должна быть такой:
точнее, при использовании select distinct sobesednik выборка содержит только sobesednik:
333
123
777
500
Это все работает. Только последовательность sobesednik-ов почему-то совершенно другая, логику определения этого порядка
я не понял. Может быть например
500
777
123
333
Вот. собственно что я не так делаю? Как по-другому получить список собеседников?
Сейчас на сайте работает довольно извратный способ.
Получаю отдельно списки from_user и to_user, перевожу их в массивы, объединяю в один, удаляю уникальные записи.
Способ работает, но результат тоже никак не привязан к дате последнего сообщения.
сделать список его собеседников, отсортированный по дате последнего сообщения.
таблица messages:
PHP:
id from_user to_user date_time content
1 100 123 2011-01-24 12:12:30 bla-bla-bla
2 123 100 2011-01-24 12:30:30
3 100 500 2011-01-24 12:31:20
4 555 777 2011-01-24 12:50:33
5 800 555 2011-01-24 12:54:12
6 100 777 2011-01-24 13:11:09
7 777 100 2011-01-24 13:22:19
8 333 555 2011-01-24 13:23:20
9 777 555 2011-01-24 13:30:45
10 100 123 2011-01-24 13:34:56
11 333 100 2011-01-24 13:36:01
а) для которых есть сообщение от него
б) от которых есть сообщение для него
в) отсортированных по дате
вроде просто:
select * from messages where from_user = 100 or to_user = 100 order by date_time desc
имеем:
PHP:
id from_user to_user date_time content
11 333 100 2011-01-24 13:36:01
10 100 123 2011-01-24 13:34:56
7 777 100 2011-01-24 13:22:19
6 100 777 2011-01-24 13:11:09
3 100 500 2011-01-24 12:31:20
2 123 100 2011-01-24 12:30:30
1 100 123 2011-01-24 12:12:30 bla-bla-bla
усложняем задачу. Поскольку нам нужен не список сообщений, а список пользователей, с которыми есть переписка, нам нужно получить
только по одной записи, в которой есть сообщение от или к другому пользователю.
Если сделать select distinct from_user или select distinct to_user, то не всегда получим полную выборку собеседников
Пришла мысль сделать так: с помощью логических функций при выборке формируется дополнительное поле sobesednik, равное
либо from_user (если from_user <> 100) либо to_user (Если to_user <> 100) и делать distinct по нему:
Без distinct выборка будет такой
PHP:
id from_user to_user sobesednik date_time content
11 333 100 333 2011-01-24 13:36:01
10 100 123 123 2011-01-24 13:34:56
7 777 100 777 2011-01-24 13:22:19
6 100 777 777 2011-01-24 13:11:09
3 100 500 500 2011-01-24 12:31:20
2 123 100 123 2011-01-24 12:30:30
1 100 123 123 2011-01-24 12:12:30 bla-bla-bla
PHP:
id from_user to_user sobesednik date_time content
11 333 100 333 2011-01-24 13:36:01
10 100 123 123 2011-01-24 13:34:56
7 777 100 777 2011-01-24 13:22:19
3 100 500 500 2011-01-24 12:31:20
333
123
777
500
Это все работает. Только последовательность sobesednik-ов почему-то совершенно другая, логику определения этого порядка
я не понял. Может быть например
500
777
123
333
Вот. собственно что я не так делаю? Как по-другому получить список собеседников?
Сейчас на сайте работает довольно извратный способ.
Получаю отдельно списки from_user и to_user, перевожу их в массивы, объединяю в один, удаляю уникальные записи.
Способ работает, но результат тоже никак не привязан к дате последнего сообщения.