Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ORDER BY + GROUP BY / 10 сообщений из 10, страница 1 из 1
28.10.2017, 18:25
    #39543755
vah-smile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
Добрый вечер. Помогите, пожалуйста, разобраться.
Делаю чат. Задача - вывести список всех пользователей, с кем ведется разговор. Причем последние диалоги должны быть вверху.
Ниже приведенный код получает список всех моих диалогов, вот только строка "GROUP BY companion" не учитывает ранее заданного "ORDER BY `messes_date` DESC". Как можно получить список companion с учетом последних переписок?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
  *
FROM
  (SELECT
    `messes_id`,
    `messes_from`,
    `messes_to`,
    `messes_text`,
    `messes_date`,
    IF(
      `messes_to` = 16484,
      `messes_from`,
      `messes_to`
    ) AS `companion`
  FROM
    a_messes_messes
  WHERE `messes_to` = '16484'
    OR `messes_from` = '16484'
  ORDER BY `messes_date` DESC) AS t
GROUP BY companion


Сам возпрос возвращает

Без использования GROUP BY
...
Рейтинг: 0 / 0
28.10.2017, 18:29
    #39543756
vah-smile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
Не привязались картинки, потому, дам просто ссылки на их:
Сам возпрос возвращает https://prnt.sc/h359rl
Без использования GROUP BY http://prntscr.com/h35ay5
...
Рейтинг: 0 / 0
29.10.2017, 07:33
    #39543889
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
vah-smileЗадача - вывести список всех пользователей, с кем ведется разговор. Причем последние диалоги должны быть вверху.
список пользователей это дно, а список диалогов совсем другое.
Ты пытаешься отсортировать по полю, которого нет в группировке.

ORDER BY maх(`messes_date`)
GROUP BY companion
...
Рейтинг: 0 / 0
30.10.2017, 15:55
    #39544583
vah-smile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
982183,

Без использования GROUP BY я получаю результат как на картинке. А как обьеденить теперь наши записи по полю companion с учетом даты?
...
Рейтинг: 0 / 0
30.10.2017, 16:12
    #39544604
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
vah-smileпоследние диалоги должны быть вверху.Что такое "последний диалог"? Если верить скриншоту, то нужны все диалоги, причём из каждого - последнее по времени сообщение. Если так - то вполне достаточно было прочитать FAQ: Выборка первой/последней записи в группах .
...
Рейтинг: 0 / 0
30.10.2017, 16:24
    #39544628
vah-smile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
Akina,

Последний диалог - это последняя переписка.
Поле companion - это ID-собеседника.

При использовании GROUP BY companion - идет сортировака по companion (без учета даты добавления сообщения - messes_date).

Проблема заключаеться в том, что у меня только одна таблица. Поле companion - я формирую в запросе исходя со значений messes_to и messes_from

Эту статью я видил, но что-то никак не пойму, как это реализовать у себя в БД...
...
Рейтинг: 0 / 0
31.10.2017, 02:26
    #39544964
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
vah-smileБез использования GROUP BY я получаю результат как на картинке.
Я не предлагал отказаться от GROUP BY
Я предлагал применить агрегирующую функцию maх(`messes_date`)

И всё же не понятен конечный результат.
"Задача - вывести список всех пользователей, с кем ведется разговор"
Я понял как таблица с полями идентифицирующими пользователя + по каждому пользователю дату/время последнего сообщения.
В приводимом тобою примере/результате слишком много полей.

В простейшем виде решение элементарно

SELECT companion, max(messes_date)
FROM messes
ORDER BY max(messes_date)
GROUP BY companion

Но твоя задача очевидно иная, и пока ты её не сформулируешь, никто помочь тебе не сможет.
Хотя в примере Akina изложен весь механизм решения.
...
Рейтинг: 0 / 0
31.10.2017, 07:57
    #39544997
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
vah-smileПоследний диалог - это последняя переписка.Переписка - это, как я понимаю, диалог с одним респондентом. Скриншот же показывает иное - для каждого респондента одна, последняя по времени, запись.
vah-smileПоле companion - это ID-собеседника.Так эти данные есть в паре полей (messes_from, messes_to). К чему такое дублирование?
vah-smileне пойму, как это реализовать у себя в БД...В Вашем случае группа - это совокупность записей по паре полей (messes_from, messes_to). Для обеспечения однозначности (перестановки) это может быть, например,
Код: sql
1.
GROUP BY LEAST(messes_from, messes_to),GREATEST(messes_from, messes_to)
...
Рейтинг: 0 / 0
03.11.2017, 21:37
    #39547661
vah-smile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
Akina,

Та все не то.
Проблема в том, что GROUP BY групирирует записи без учета времени добавления.
Параметр ORDER BY - не влияет на GROUP BY.
А MAX(`messes_id`) - возвращает только одину последнюю запись.

В общем, результат выборки должен быть как на рисунке 20912496 , а у нас сейчас https://prnt.sc/h359rl (сортировака идет по полю companion, а все остальные поля не являются последними для companion)
...
Рейтинг: 0 / 0
04.11.2017, 05:30
    #39547721
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY + GROUP BY
vah-smile,

не MAX(`messes_id`) а max(`messes_date`)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ORDER BY + GROUP BY / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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