@RizyaRU

Как сделать правильно группировку?

Пытаюсь сделать простой обмен сообщениями между пользователями.
Набросал следующую табличку:
таблица mails
CREATE TABLE `mails` (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `sender_id` bigint unsigned DEFAULT NULL COMMENT 'ID отправителя',
 `recipient_id` bigint unsigned DEFAULT NULL COMMENT 'ID получателя',
 `message` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Сообщение',
 `system` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Системное ли сообщение',
 `read` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Прочитано ли сообщение',
 `trash` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Удалено ли сообщение',
 `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата добавления',
 `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Дата последнего обновления',
 PRIMARY KEY (`id`),
 KEY `sender_id` (`sender_id`),
 KEY `recipient_id` (`recipient_id`),
 CONSTRAINT `mails_ibfk_1` FOREIGN KEY (`sender_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
 CONSTRAINT `mails_ibfk_2` FOREIGN KEY (`recipient_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB


Необходимо выбрать отправителя (sender_id), получателя (recipient_id), последнее сообщение (message) и почитано ли это сообщение! (read)

Проблема в том, что когда я делаю группировку по полю

GROUP BY sender_id


чтоб получить уникальные "диалоги", MySQL ругается на неагрегированные столбцы
Ну а если отключить
sql_mode=only_full_group_by


я получаю вовсе не то, чего хотелось бы

а если делаю подзапрос, то вообще ничего не меняется, потому как я не понимаю что именно мне в таком случае нужно :(

помогите составить запрос. Или помогите в принципе )).
то, что у меня получилось, явно не то, что мне нужно
слабонервным не смотреть

SELECT GROUP_CONCAT(`m`.`message` ORDER BY `m`.`id` DESC) AS `message`,
					`u`.`id`, `u`.`name`, `m`.`read`
				FROM `mails` AS `m`
				JOIN `users` AS `u`
					ON `m`.`sender_id` = `u`.`id`
				WHERE `m`.`recipient_id` = $user_id
				GROUP BY `sender_id`
  • Вопрос задан
  • 33 просмотра
Решения вопроса 1
@RizyaRU Автор вопроса
Ну так вроде должно работать??

SELECT * FROM `mails` 
WHERE `id` IN (SELECT MAX(`id`) 
		FROM `mails` 
		GROUP BY `sender_id`) 
AND `recipient_id`= 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MaximaXXl
SELECT distinct
first_value(`m`.`message`) over (partition by sender_id, recipient_id ORDER BY `m`.`id` DESC) AS `message`,
          `u`.`id`, `u`.`name`, `m`.`read` , recipient_id /*вывел чтоб было видно с кем он общался*/
        FROM `mails` AS `m`
        JOIN `users` AS `u`
          ON `m`.`sender_id` = `u`.`id`
        WHERE `m`.`recipient_id` = $user_id


Если надо реально последнее сообщение этого человека, уберите recipient_id
ORDER BY `m`.`id` DESC - так себе сортировка, лучше перейти на updated
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
7skills Ижевск
от 120 000 до 150 000 ₽
от 140 000 до 170 000 ₽
07 мар. 2021, в 03:18
1500 руб./за проект
06 мар. 2021, в 22:58
70000 руб./за проект
06 мар. 2021, в 22:36
10000 руб./за проект