2016-04-12 7 views
1

Ich brauche eine SQL, die Self Join auf max ID von der ersten Tabelle verwendet. Bitte schauen Sie sich das folgende Bild der Tabelle an. Ich gruppiere die Tabelle nach service_id, aber ich brauche die letzte Nachricht jeder Gruppe. Für die Gruppe 5 der Servicegruppe sollte die Anzahl der Nachrichten 3 betragen und last_message sollte drittesMsg5 sein. Ich schrieb eine SQL-Datei unter alles andere ist in Ordnung, aber es wirft einen Fehler im Falle von Self-Join. Es kann msgTbl1.last_message_id nicht erkennen. Ich denke, ich rufe es an, bevor ich es vorbereite. Ich brauche Hilfe, um dieses Problem zu lösen, was wäre der beste SQL, um dies in einer Abfrage zu lösen? Und wenn möglich, bitte geben Sie mir diese Abfrage im Laravel Query Builder Format.Mysql selbst Beitritt auf maximale ID zurückgegeben von der ersten Tabelle mit groupby

SELECT count(msgTbl1.id) as message_count, 
     max(msgTbl1.id) as last_message_id, 
     msgTbl1.body, 
     msgTbl2.body as last_message, 
     services.name as service_name 
FROM messages msgTbl1 
LEFT JOIN (SELECT id, body FROM messages) AS msgTbl2 
    ON msgTbl2.id = msgTbl1.last_message_id 
LEFT JOIN services on services.id = msgTbl1.service_id 
WHERE receiver_id = 4 AND read_user = 'no' 
GROUP BY msgTbl1.service_id 

enter image description here

SQL für die Nachrichtentabelle

CREATE TABLE `messages` (
    `id` int(11) UNSIGNED NOT NULL, 
    `sender_id` int(11) UNSIGNED DEFAULT NULL, 
    `receiver_id` int(11) UNSIGNED DEFAULT NULL, 
    `service_id` int(11) UNSIGNED NOT NULL, 
    `sender_type` enum('user','agent','admin') NOT NULL, 
    `receiver_type` enum('user','agent','admin') NOT NULL, 
    `body` text, 
    `files` varchar(500) DEFAULT NULL COMMENT 'serialize', 
    `new_notification` enum('no','yes') NOT NULL DEFAULT 'yes', 
    `read_user` enum('yes','no') NOT NULL DEFAULT 'no', 
    `read_agent` enum('yes','no') NOT NULL DEFAULT 'no', 
    `status` enum('active','archive','deleted') NOT NULL DEFAULT 'active', 
    `created_at` datetime NOT NULL, 
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `messages` (`id`, `sender_id`, `receiver_id`, `service_id`, `sender_type`, `receiver_type`, `body`, `files`, `new_notification`, `read_user`, `read_agent`, `status`, `created_at`, `updated_at`) VALUES 
(1, 22, 4, 5, 'user', 'agent', 'firstMsg5', NULL, 'yes', 'no', 'yes', 'active', '2016-03-24 00:00:00', '2016-04-12 05:40:28'), 
(2, 22, 4, 5, 'user', 'agent', 'secondMsg5', NULL, 'yes', 'no', 'yes', 'active', '2016-03-24 00:00:00', '2016-04-12 05:40:31'), 
(3, 22, 4, 9, 'user', 'agent', 'firstMsg9', NULL, 'yes', 'yes', 'yes', 'active', '2016-03-24 00:00:00', '2016-04-12 05:40:45'), 
(4, 4, 4, 9, 'agent', 'user', 'secondMsg9', NULL, 'yes', 'yes', 'yes', 'active', '2016-03-24 00:00:00', '2016-04-12 05:40:56'), 
(5, 22, 4, 5, 'user', 'agent', 'thirdMsg5', NULL, 'yes', 'yes', 'yes', 'active', '2016-03-24 00:00:00', '2016-04-12 05:41:08'); 
+0

Dank @rhavendc ich es schon einmal ausprobiert, es funktioniert nicht. gleicher Fehler ** Unbekannte Spalte 'last_message_id' in 'on Klausel' ** – murad

Antwort

1

Try this:

SELECT message_count, 
     last_message_id, 
     msgTbl1.body,   
     services.name as service_name 
FROM messages msgTbl1 
INNER JOIN (
    SELECT MAX(id) AS last_message_id, COUNT(*) AS message_count 
    FROM messages 
    WHERE read_user = 'no' 
    GROUP BY service_id) AS msgTbl2 
    ON msgTbl1.id = msgTbl2.last_message_id 
LEFT JOIN services on services.id = msgTbl1.service_id 
WHERE receiver_id = 4 
+0

Danke @Giorgos Betsos für Ihre Antwort. Aber es löst noch nicht https://gyazo.com/f2d21a638fd0b4b4bb2e2c95fb14bd11 Es zeigt einige zwei Nachrichten unter gleichen Service. schauen Sie zuerstMsg5 und secondMsg5 sind im gleichen Service. Ich brauche Ausgabe wie es https://gyazo.com/163e76c86185228642a92c95cbb3dfcd – murad

+0

@murad Versuchen Sie mit 'INNER JOIN' und sagen Sie mir, welche Ergebnisse Sie bekommen. –

+0

INNER JOIN wirft ein leeres Ergebnis. – murad