2016-04-12 5 views
1

最初のテーブルのmax idに自己結合を使用するsqlが必要です。次の表の画像を見てください。私はservice_idでテーブルをグループ化していますが、各グループの最後のメッセージが必要です。サービスグル​​ープ5の場合、メッセージ数は3で、last_messageはthirdMsg5でなければなりません。私は他のすべての下にSQLを書いたが、それは自己結合の場合にはエラーを投げている。 msgTbl1.last_message_idを認識できません。私はそれを準備する前にそれを呼んでいると思う。私はこの問題を1つのクエリでこれを解決するには最高のSQLとなるだろう解決するために助けが必要ですか?可能であれば、このクエリをlaravelクエリビルダ形式で提供してください。groupbyを使用して最初のテーブルから返されたmax idにMysql自己結合

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

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

感謝を。同じエラー。 ** 'on句'の 'last_message_id'列が不明** – murad

答えて

1

これを試してみてください:私は前にそれを試してみました、それは動作しません@rhavendc

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

返信のため、@Giorgos Betsosに感謝します。 しかしまだ解決しません https://gyazo.com/f2d21a638fd0b4b4bb2e2c95fb14bd11 同じサービスの下で2つのメッセージが表示されています。 look firstMsg5とsecondMsg5は同じサービスです。 出力が必要です https://gyazo.com/163e76c86185228642a92c95cbb3dfcd – murad

+0

@murad「INNER JOIN」を試してみて、結果を教えてください。 –

+0

INNER JOINは空の結果を投げます。 – murad

関連する問題