사용자가 메시지를주고받는 '메시지'테이블이 있습니다. 내가 뭘하고 싶은지 : receiver_id가 X 인 DISTINCT sender_ids를 검색하고, 수신자 X가 읽지 않은 메시지를 가진 사용자가 먼저 나타나고 수신자 X가 읽은 메시지의 사용자가 후에 모든 것이 정렬되어 정렬되도록 정렬해야합니다. created_at DESC.Mysql 쿼리, 정렬, 그룹화 및 성능에 대한 조언이 필요합니다.
어떻게하면이 아이디어를 얻을 수 있습니까? 참고 : 성능 또한 문제입니다.
이것은 내가 사용하고있는 쿼리이지만 정렬 작업이 실제로 올바르게 수행되지 않았거나 DISTINCT가 작동하지 않는 것 같습니다. 나는 결과 6, 5, 4, 2, 3 기대하고있다 -하지만 여기
SELECT DISTINCT sender_id
FROM message m
WHERE receiver_id = 1
ORDER BY read_at, created_at DESC
2 샘플 데이터로 테이블, 3, 4, 5, 6 얻고 다음
CREATE TABLE `message` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sender_id` bigint(20) NOT NULL,
`receiver_id` bigint(20) NOT NULL,
`message` text,
`read_at` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sender` (`sender_id`),
KEY `receiver` (`receiver_id`),
KEY `dates` (`receiver_id`,`read_at`,`created_at`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
INSERT INTO `message` (id, sender_id, receiver_id, message, read_at, created_at)
VALUES
(1,2,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:01'),
(2,1,2,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:02'),
(3,2,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:03'),
(4,3,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:04'),
(5,3,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:05'),
(6,1,4,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:06'),
(7,4,1,NULL,NULL,'2011-01-01 01:01:07'),
(8,5,1,NULL,NULL,'2011-01-01 01:01:08'),
(9,5,1,NULL,NULL,'2011-01-01 01:01:09'),
(10,1,6,NULL,NULL,'2011-01-01 01:01:10'),
(11,6,1,NULL,NULL,'2011-01-01 01:01:11');
까다로운 상황은 동일한 사용자가 읽지 않은 메시지와 읽은 메시지가 모두 있고 두 번째가 아닌 첫 번째 그룹에 발신자가 배치되어 있는지 확인하는 것입니다. – outis
보낸 사람이 보내는 메시지가 여러 개인 경우'created_at'를 정렬에 사용 하시겠습니까? 가장 최근 또는 가장 오래된 메시지? – outis
@outis, 가장 최근의 created_at를 원합니다. 아래의 답안에서 귀하의 솔루션이 작동하지만, 성능 향상을 위해 할 수있는 일이 있는지 궁금합니다. 많은 다른 발신자/수신자간에 많은 메시지가있을 것을 두려워합니다. – BugBusterX