Эх сурвалжийг харах

fix:修复sql分组排序使用严格校验模式下sql的错误

yangyi 4 сар өмнө
parent
commit
cefe8af348

+ 28 - 13
src/main/resources/mapper/MessageMapper.xml

@@ -3,20 +3,35 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.campus.trade.mapper.MessageMapper">
     <select id="selectConversations" resultType="com.campus.trade.vo.ConversationVO">
+        -- 子查询找出每个对话的最新消息ID
         SELECT
-            CASE WHEN m.from_user_id = #{userId} THEN m.to_user_id ELSE m.from_user_id END AS userId,
-            u.nickname, u.avatar_url,
-            m.content AS lastMessage,
-            m.image_url AS lastMessageImage,
-            m.created_at AS lastMessageTime,
-            (SELECT COUNT(*) FROM message WHERE to_user_id = #{userId}
-             AND from_user_id = CASE WHEN m.from_user_id = #{userId} THEN m.to_user_id ELSE m.from_user_id END
-             AND is_read = 0) AS unreadCount
-        FROM message m
-        JOIN user u ON u.id = CASE WHEN m.from_user_id = #{userId} THEN m.to_user_id ELSE m.from_user_id END
-        WHERE m.from_user_id = #{userId} OR m.to_user_id = #{userId}
-        GROUP BY userId
-        ORDER BY MAX(m.created_at) DESC
+            otherUser.id AS userId,
+            otherUser.nickname,
+            otherUser.avatar_url,
+            lastMsg.content AS lastMessage,
+            lastMsg.image_url AS lastMessageImage,
+            lastMsg.created_at AS lastMessageTime,
+            (SELECT COUNT(*) FROM message
+             WHERE to_user_id = #{userId}
+               AND from_user_id = otherUser.id
+               AND is_read = 0) AS unreadCount
+        FROM (
+            -- 为每个对话伙伴找出最新消息的时间
+            SELECT
+                CASE WHEN m.from_user_id = #{userId} THEN m.to_user_id ELSE m.from_user_id END AS partner_id,
+                MAX(m.created_at) AS max_created_at
+            FROM message m
+            WHERE m.from_user_id = #{userId} OR m.to_user_id = #{userId}
+            GROUP BY partner_id
+        ) latest
+        -- 关联获取最新消息的完整信息
+        JOIN message lastMsg ON (
+            (lastMsg.from_user_id = #{userId} AND lastMsg.to_user_id = latest.partner_id)
+            OR (lastMsg.from_user_id = latest.partner_id AND lastMsg.to_user_id = #{userId})
+        ) AND lastMsg.created_at = latest.max_created_at
+        -- 关联获取对方用户信息
+        JOIN user otherUser ON otherUser.id = latest.partner_id
+        ORDER BY lastMsg.created_at DESC
     </select>
     <select id="selectHistory" resultType="Message">
         SELECT * FROM message