【问题标题】:MySQL join 2 tables and retrieve the latest timestamp and messageMySQL 加入 2 个表并检索最新的时间戳和消息
【发布时间】: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

【问题讨论】:

  • 发布此类问题时,也习惯于发布您的尝试。
  • 抱歉还是习惯了这个网站
  • 不用担心。如果您自己想通了,您可以发布自己对问题的答案并接受它为正确的

标签: mysql join max


【解决方案1】:

这样的事情应该可以工作。

SELECT IF(m.userid = '101', m.senderid, m.userid) contact, m.message, m.timestamp, u.first_name, u.url
FROM messages m
INNER JOIN(
    SELECT MAX(timestamp) max_time, IF(userid = '101', senderid, userid) contact 
    FROM messages 
    WHERE userid = '101' OR senderid = '101'
    GROUP BY contact
) j ON j.contact = IF(m.userid = '101', m.senderid, m.userid) AND m.timestamp = j.max_time
LEFT JOIN users u ON u.userid = IF(m.userid = '101', m.senderid, m.userid)

附:这实际上并不能告诉您谁发送了最新消息(您或您的联系人),获取每个结果行的发件人 ID 和用户 ID 可能更有用,而不仅仅是联系人 ID。

【讨论】:

  • 这看起来不错,但我收到错误“'on clause' 中的未知列 'm.contact'”
  • 是的,我的错,没有事先测试查询。我编辑了查询,现在它应该可以工作了。仍然没有测试它,所以不要相信我的话。我回家后可能会测试它。
【解决方案2】:

试试类似的东西:

select * from (
 select m.senderId userid,
        u.first_name,
        u.url,
        m.message,
        m.timestamp        
 from users u inner join messages m
              on u.userid=m.userid
 order by timestamp desc
) t
limit 1;

【讨论】:

  • 不,它只带回 1 条记录,也只加入 users.userid = messages.userid 但如果其他用户回复了消息,则 user.usersid 将需要加入 messings.senderid。我想在这种情况下可以使用 CASE WHEN 吗?但它仍然不会从消息表和联系人姓名晚上带回最新消息,尽管它们可能是发件人,具体取决于谁发送了最后一条消息,但如果是我,那么我仍然希望它显示联系人。跨度>
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多