[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Немного изменил запрос, проверьте пжл
Страницы: 1, 2
ApuktaChehov
Причем тут диалоги?
Я же описал там алгоритм работы. Берутся все сообщения отправленные юзеру или полученные от него и возвращается самое последнее.

Задача же, вывести последнее сообщение, отправленное или полученное.

Или чего-то не понял?

_____________
Kusss
ApuktaChehov
Цитата
На примере будет проще объяснить, в VK личные сообщения показывают так,
последние отправленные с каждым пользователем и не важно входящие или исходящие.
S.Chushkin
Цитата (Медведь @ 6.04.2015 - 18:10)
Такой запрос правильно переделан?

Нет.

Цитата (Медведь @ 6.04.2015 - 18:10)
Собственно задача была такая : '
...
последние отправленные с каждым пользователем и не важно входящие или исходящие.

Если я правильно понял задачу, то нужно найти последние сообщения для юзера отдельно для каждого другого, кто посылал ему или получал от него сообщения.
Если нет, т.е. нужно просто получить последнее сообщение для/от юзера, то задачка тривиальная. (см. ApuktaChehov, например)
Если да, то принцип тот же, что и в предыдущей теме, только задачка посложнее.
Классический вариант:
select t.* 
from (select max(id) id
from (
/* последнее отправленное сообщение для "ИД настоящего пользователя" для каждого получателя */
select id_otpr userID, id_poluch userID2, max(id) id
from table
where
id_otpr = '$Id_настоящего пользователя'
group by id_otpr, id_poluch
union all
/* последнее полученное сообщение для "ИД настоящего пользователя" для каждого отправителя */
select id_poluch userID, id_otpr userID2, max(id) id
from table
where
id_poluch = '$Id_настоящего пользователя'
group by id_poluch, id_otpr
) b
group by userID, userID2
) a /* этот селект выбирает из двух последних (входящее + выходящее) самый последний для каждого связанного юзера */
left join table t on t.id = a.id -- используется для получения значений полей, не перечисленных в GROUP BY только, поэтому для эффективности фильтрацию (WHERE) надо делать в подзапросе


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Kusss
Работает smile.gif. Самому было интересно как это решалось.
НО ты его не проверял, и есть ряд ошибок (3 штуки). Не знаю конечно, но возможно намеренно. ph34r.gif
S.Chushkin
Не проверял sad.gif
Одну поправил. Какие ещё?

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Kusss
status - лишнее.
where должно быть перед group by
S.Chushkin
Точно.
Мусор убрал, порядок поменял.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Миша
Цитата (S.Chushkin @ 8.04.2015 - 12:37)

Классический вариант:
select t.* 
from (select max(id) id
  from (
    /* последнее отправленное сообщение для "ИД настоящего пользователя" для каждого получателя */
    select id_otpr userID, id_poluch userID2, max(id) id
    from table
    where
id_otpr = '$Id_настоящего пользователя'
    group by id_otpr, id_poluch
    union all
    /* последнее полученное сообщение для "ИД настоящего пользователя" для каждого отправителя */
    select id_poluch userID, id_otpr userID2, max(id) id
    from table
    where
id_poluch = '$Id_настоящего пользователя'
    group by id_poluch, id_otpr
  ) b
  group by userID, userID2
) a /* этот селект выбирает из двух последних (входящее + выходящее) самый последний для каждого связанного юзера */
left join table t on t.id = a.id -- используется для получения значений полей, не перечисленных в GROUP BY только, поэтому для эффективности фильтрацию (WHERE) надо делать в подзапросе



Очень круто, а в конце можно добавить ?:
ORDER BY t.id DESC


_____________
Принимаю заказы, писать в ЛС
S.Chushkin
Конечно.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.