powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Последние сообщения и group by
10 сообщений из 10, страница 1 из 1
Последние сообщения и group by
    #38379367
unknown21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, есть табличка

messages:
id|sender|receiver|date|msg|

необходимо выбрать последние сообщения в беседах юзера A ( sender= A)

то есть
1| A| B| 2008..| hello|
2| A| B| 2007..| bye |
3| A| C| 2008..| hi |

должно вывести 1 и 3 строки
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38379370
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknown21,

7543220
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38379405
unknown21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcunknown21,

7543220

спасибо большое , пока получилось следующее

Код: sql
1.
2.
3.
select t.messages from ( select max(date) as MaxTime,id from messages where 
					 sender='john11432@mm.ru' group by receiver) r
INNER JOIN messages t ON t.id = r.id AND t.date = r.MaxTime




что выдает только одну строку, но если модифицировать запрос ,и сделать join только по дате все работает
Код: sql
1.
2.
3.
select t.messages from ( select max(date) as MaxTime,id from messages where 
					 sender='john11432@mm.ru' group by receiver) r
INNER JOIN messages t ON t.date = r.MaxTime



возник вопрос а корректно ли делать join по дате, ничего если она будет не уникальна?(в примере кстати такая же ситуация join по score)
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38379408
unknown21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хмм .. как вариант заметил что можно использовать вместо max(date) - max(id) и join по нему
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38403740
unknown21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дополнение к задаче

необходимо выбрать последние сообщения в беседах юзера A ( sender= A or receiver =A )

предполгагаю что нужно делать два джойна( или условный group by), но пока не могу понять как их потом обьеденить

так не выходит :

Код: sql
1.
2.
3.
select t.messages from ( select max(id) as maxx from messages where 
					 (sender='john11432@mm.ru' group by receiver ) or    (receiver ='john11432@mm.ru' group by sender)   ) r
INNER JOIN messages t ON t.id = r.maxx 
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38403800
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcunknown21,

7543220 Не совсем точная ссылка — там обсуждается поиск максимумов для каждого пользователя, а здесь требуются максимумы для одного конкретного пользователя, что значительно проще
Код: sql
1.
2.
3.
4.
5.
select *
from messages
where '$usr' in (sender,receiver)
order by date desc
limit 2;

Или, если нужны поледние отосланное и полученное сообщения,
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from(
   (select * from messages where '$usr'=sender
      order by date desc limit 1)
   union all
   (select * from messages where '$usr'=receiver
      order by date desc limit 1)
   )u
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38404098
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007javajdbcunknown21,

7543220 Не совсем точная ссылка — там обсуждается поиск максимумов для каждого пользователя, а здесь требуются максимумы для одного конкретного пользователя, что значительно проще[src]
select *
from messages
where '$usr' in (sender,receiver)
order by date desc
limit 2;
....

Конкретно в самом первом посте была задача имено
для приведеной ссылке. Там задано найти
крайнее сообшения для нескольких
бесед заданого юзера с разными абонентами.
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38404100
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007.....Или, если нужны поледние отосланное и полученное сообщения,
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from(
   (select * from messages where '$usr'=sender
      order by date desc limit 1)
   union all
   (select * from messages where '$usr'=receiver
      order by date desc limit 1)
   )u



опятже, один юзер может имень несколько бесед.
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38404106
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот неоптимизированый, но функционально верный СКЛ:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * 
from messages mm
where mm.id in
(
select max(id) max_id, if(m.sender='abc',m.receiver,m.sender) abonent
from messages m
where m.sended = 'abc' or m.receiver = 'abc'
group by abonent
)
...
Рейтинг: 0 / 0
Последние сообщения и group by
    #38404109
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так быдет быстро:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select * 
from messages mm
where mm.id in
(
select 
  max(id) max_id
from 
(
  select m5.id, m5.receiver abonent
  from messages m5
  where m5.sender = 'abc'  -- по индексу
  union all
  select m6.id, m6.sender abonent
  from messages m6
  where m6.receiver = 'abc'   -- по индексу
) mmm
group by abonent
)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Последние сообщения и group by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]