【问题标题】:Finding latest message from table, grouped by user in mysql从表中查找最新消息,在 mysql 中按用户分组
【发布时间】:2015-06-30 05:57:32
【问题描述】:

我的网站上有一个私人消息表,现在我有一个单独的收件箱和发件箱。我想合并收件箱/发件箱,只显示特定用户的最新消息。

TLDR:我想显示按发送给每个用户或来自每个用户分组的最新消息。

表格示例

|  id | fromuser | fromid | touser | toid | message    |  timestamp            |
--------------------------------------------------------------------------------
|  1  | user1    |  1     | user2  |  2   | Hello..    |  2015-01-01 00:00:00  |
|  2  | user1    |  1     | user3  |  3   | okay...    |  2015-01-02 00:00:00  |
|  3  | user3    |  3     | user1  |  1   | not....    |  2015-01-03 00:00:00  |
|  4  | user2    |  2     | user3  |  3   | New....    |  2015-01-04 00:00:00  |
|  5  | user2    |  2     | user1  |  1   | With.....  |  2015-01-05 00:00:00  |
--------------------------------------------------------------------------------

我在用户 1 中寻找的结果

|  id | fromuser | fromid | touser | toid | message    |  timestamp            |
--------------------------------------------------------------------------------
|  3  | user3    |  3     | user1  |  1   | not....    |  2015-01-03 00:00:00  |
|  5  | user2    |  2     | user1  |  1   | With.....  |  2015-01-05 00:00:00  |
--------------------------------------------------------------------------------

使用下面的代码,我可以让它向每个用户显示一条消息或来自每个用户的一条消息,但它显示的是最旧的消息而不是最新的消息。

mysql_query("SELECT m1.*, users.id AS userid, users.username 
    FROM pm AS m1, pm AS m2, users 
    WHERE ((m1.fromuser='".$_SESSION['userName']."' AND users.id=m1.toid) 
    OR (m1.touser='".$_SESSION['userName']."' AND users.id=m1.fromid)) 
    AND m2.id=m1.id ORDER BY timestamp DESC");

【问题讨论】:

  • 为什么我在您的表之间看不到任何连接?加入表格并使用限制功能怎么样?
  • 查看了该链接,它将返回所有消息,而不仅仅是来自或来自已登录用户的消息。
  • 然后修改该查询并添加您的...='".$_SESSION['userName']."'

标签: php mysql messages


【解决方案1】:

试试这个:

选择 * 来自消息 m 不存在的地方( 选择 1 来自消息mm 其中 (mm.fromuser = m.fromuser 或 mm.fromuser = m.touser) AND (mm.touser = m.touser 或 mm.touser = m.fromuser) 和 mm.timestamp > m.timestamp ) 和 m.fromuser = 'user1' 或 m.touser = 'user1';

demo here.

今后,将两个用户之间的对话标记为特定对话可能会更好,然后每条消息都属于一个对话,因此查找用户参与的对话以及有关消息的信息变得容易得多与谈话有关。无论如何。

试试这个吧。呃。

select m.* 
  from messages m 
     left join messages m2 
       on ((m.fromuser = m2.fromuser and m.touser = m2.touser) 
           or (m.fromuser = m2.touser and m.touser = m2.fromuser)) 
         and m.timestamp < m2.timestamp 
  where (m.fromuser = 'user1' or m.touser = 'user1') 
  and m2.id is null;

它可能优于not exists 版本,即使我确实设法修复了那个。

this fiddle actually works

【讨论】:

  • 这似乎返回了不止一行从同一发件人发送给“user1”的消息
  • 正确。这正是操作所要求的,因为它们来自不同的用户
  • 我将 'user1' 替换为 '".$_SESSION['userName']."' 但它返回来自同一发件人示例的多条消息:sqlfiddle.com/#!9/28eb7/1/0
  • 我确实在此处更新了示例数据一个新链接 sqlfiddle.com/#!9/28eb7/1/0
  • 是的,对不起。疲劳的。现在小提琴需要很长时间才能响应
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2013-09-24
  • 2021-06-08
  • 2017-03-22
相关资源
最近更新 更多