【发布时间】:2016-04-26 13:14:48
【问题描述】:
我正在尝试重新创建一个对话列表,例如 whatsapp,其中显示与您进行对话的人的联系人姓名,以及发布消息的时间以及最后一条消息,无论它是来自您还是发布消息的联系人,换句话说,我需要始终查看联系人姓名和上次发布消息的时间以及可能由我或收件人发送的最后一条消息,我还需要带回图片users 表中的另一个用户。
用户表
userid | first_name | url |
---------------------------------------------
101 | name1 | www.image_url1.jpg |
102 | name2 | www.image_url2.jpg |
103 | name3 | www.image_url3.jpg |
104 | name4 | www.image_url4.jpg |
消息表
MessageId | userid | senderid | message | timestamp |
-----------------------------------------------------------
1 | 101 | 102 | message1 | 1234567 |
2 | 102 | 101 | message2 | 1234578 |
3 | 101 | 102 | message3 | 1235679 |
4 | 104 | 101 | message4 | 1256379 |
如果我的用户 ID = 101 是我或联系人的最后一条消息和时间戳以及联系人用户 ID、名字和 url,我试图从数据库中查询
userid | first_name | url | message | timestamp |
---------------------------------------------------------------------
102 | name2 | www.image_url2.jpg | message3 | 1235679 |
104 | name4 | www.image_url4.jpg | message4 | 1227878 |
1) 我想从 users 表中提取联系人的 userid、first_name 和 url
2) 并从联系人的消息表中提取最新消息和时间戳
所以换句话说,我需要显示我或消息表中的其他联系人发布的最后一条消息和时间戳,以及用户表中的 url 和用户名,但不是我的用户名和图像 url,只是联系人。
这是我目前的查询
SELECT DISTINCT users.userid, users.first_name, users.url, message, MAX(messages.timestamp) AS utime FROM messages JOIN users ON users.userid = messages.senderid WHERE users.userid <> '101' AND (messages.userid = '101' OR messages.senderid = '101') GROUP BY 1,2,3 ORDER BY utime DESC
我也尝试了以下方法,但效果不佳
SELECT DISTINCT mems.userid, mems.first_name, mems.url, message, MAX(messaging.timestamp) AS utime
FROM messaging
JOIN mems
ON mems.userid = CASE
WHEN
messaging.senderid = '101'
THEN
messaging.userid
ELSE
messaging.senderid
END
WHERE mems.userid <> '101' AND (messaging.userid = '101' OR messaging.senderid = '101')
GROUP BY 1,2,3 ORDER BY utime DESC
【问题讨论】:
-
发布此类问题时,也习惯于发布您的尝试。
-
抱歉还是习惯了这个网站
-
不用担心。如果您自己想通了,您可以发布自己对问题的答案并接受它为正确的