Пытаюсь сделать простой обмен сообщениями между пользователями.
Набросал следующую табличку:
таблица mailsCREATE 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`