Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2017, 23:03   #1
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию Группировка после сортировки

Здравствуйте. Делаю сайт с чатом между пользователями. Задача вроде не сложная, но неделя прошла, а проблема осталась. В общем есть страница сообщений. С 1 стороны список переписок с другой поле для сообщений. Выбираешь собеседника и во 2 стороне появляется история и тд и тп. Проблема в том что слева где выводится список собеседников должно выводиться последнее сообщение с этим пользователем. Решение было сделать поиск где отправитель или получатель это сам пользователь(то есть либо ты последний писал либо тебе) а второй это собеседник. Делается сортировка в подзапросе, а потом в основном запросе групировка что бы вывести только последние сообщение каждого собеседника. Вот сам запрос:

SELECT * FROM (SELECT * FROM users, messages WHERE (messages.message_sender_id=4 OR messages.message_recipient_id=4) AND (users.user_id=messages.message_sen der_id OR users.user_id=messages.message_reci pient_id) ORDER BY messages.message_date) AS resipient GROUP BY resipient.user_id ORDER BY resipient.message_date

Буду очень благодарен если поможете исправить запрос либо, если этот запрос вообще не верный, подсказать как он должен выглядеть
Андрей Цапко вне форума Ответить с цитированием
Старый 11.04.2017, 09:33   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
потом в основном запросе групировка что бы вывести только последние сообщение каждого собеседника.
это (выбор последних) видимо (скорее всего) должен делать как раз подзапрос.
Код:
SELECT max(message_date) --последний по дате // а для кого???
     , message_sender_id, message_recipient_id // видимо для каждого отправителя и в нужную сторону (т.е. еще и для каждого получателя от данного отправителя )
        
       FROM users, messages 
       WHERE          AND ( users.user_id=messages.message_sen der_id 
            OR users.user_id=messages.message_reci pient_id ) 
       ORDER BY messages.message_date надо не сортитовать а 
 GROUP BY --а группипровать
         message_sender_id, message_recipient_id --по тем самым отправителям-получателям
теперь когда мы УЖЕ знаем последние сообщения в КАЖДОЙ паре отправитель-получатель (ЕГО дату)
Код:
select *
from ( --здесь нужные нам "последние" 
      SELECT max(message_date) as lastdate_msg, message_sender_id, message_recipient_id 
      .... --смотри выше 
     ) as lastmsg, -- даты последних по каждому есть, а что нужно еще ???
messages, users  --сами сообщения и отправители(?) 
WHERE ( --отбираем сообщение по ТРЕМ значениям
        messages.message_sender_id= lastmsg.message_sender_id 
    and messages.message_recipient_id= lastmsg.message_recipient_id
    and messages.message_date =lastmsg.lastdate_msg )

 AND ( -- для НУЖНЫХ нам собеседников
       messages.message_sender_id=4 
    OR messages.message_recipient_id=4 )

 AND -- добавим данные об отправителе
     users.user_id=messages.message_sender_id 
    
ORDER BY  -- и НАКОНЕЦ сортируем
         messages.message_date
P.S. надеюсь, это то что надо, т.к. не совсем уверен в правильном понимании исходной задачи.

P.P.S. для новичков в SQL обычно рекомендую старую проверенную книгу
Мартин Грубер. Понимание SQL. была выложена и здесь на форуме(в т.ч. мною).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.04.2017 в 09:35.
evg_m вне форума Ответить с цитированием
Старый 12.04.2017, 22:11   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Огромное спасибо. Ваш ответ очень помог. Не много не понимаю как это работает, но я все же недавно изучаю SQL-запросы. Думаю разберусь. Главное что работает. Не много переделал правда под структуру БД и под мелкие нужды. В общем огромное спасибо!
Андрей Цапко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отобразить что после сортировки число встало под другим индексом ? роман-талица Microsoft Office Excel 16 17.02.2017 13:21
[Pascal] нужно сформировать матрицу из векторов, вектора x,y,z должны стать столбцами матрицы, остановилась после сортировки векторов anna77777 Помощь студентам 3 07.01.2017 01:22
Слияние двух массивов введённых в консоли после их сортировки по убыванию и возрастанию Кодер2 C# (си шарп) 1 02.11.2016 23:19
Поменять местами два последних элемента массива после сортировки (язык си) PPPPPP Помощь студентам 2 18.04.2010 18:13
Макрос умирает после сортировки Skandalius Microsoft Office Excel 17 10.09.2009 16:35