Ich habe eine "Nachricht" -Tabelle, wo Benutzer senden und empfangen von Nachrichten, ziemlich einfach. Was ich tun möchte, ist: abrufen DISTINCT sender_ids WHERE receiver_id ist X, und haben es auf eine Weise sortiert, wo Benutzer von wem Empfänger X ungelesene Nachrichten zuerst angezeigt und Benutzer von dem Empfänger X gelesen hat Nachrichten erscheinen nach und alles nach sortiert created_at DESC.Beratung benötigt mit Mysql Abfrage, Sortierung, Gruppierung und Leistung
Irgendwelche Ideen, wie ich das erreichen kann? Hinweis: Leistung ist auch ein Problem.
Dies ist die Abfrage, die ich verwendet habe, aber es scheint, dass die Sortierung nicht wirklich richtig gemacht wird, vielleicht DISTINCT verschraubt Dinge? Ich erwarte Ergebnis 6, 5, 4, 2, 3 - aber bin immer 6, 5, 4, 3, 2
SELECT DISTINCT sender_id
FROM message m
WHERE receiver_id = 1
ORDER BY read_at, created_at DESC
Hier ist die Tabelle mit Beispieldaten:
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');
Die knifflige Situation ist, wenn sowohl ungelesene als auch gelesene Nachrichten von demselben Benutzer vorliegen und sichergestellt wird, dass der Absender in die erste Gruppe und nicht in die zweite Gruppe gestellt wird. – outis
Wenn mehrere Nachrichten von einem Absender vorhanden sind, welche "created_at" möchten Sie zum Sortieren verwenden, die neueste oder die älteste? – outis
@outis, ich möchte die neueste für created_at. Ihre Lösung in der Antwort unten funktioniert, ich frage mich, ob es etwas gibt, was ich tun kann, um die Leistung zu verbessern, obwohl ich befürchte, dass es viele Nachrichten zwischen vielen verschiedenen Sender/Empfänger geben wird. – BugBusterX