【问题标题】:mysql query for messaging system消息系统的mysql查询
【发布时间】:2013-01-19 18:33:23
【问题描述】:

我正在开发消息传递系统,但在写下查询 (MYSQL) 时遇到了麻烦。 简而言之,查询应该为每个对话用户返回一个包含最后一条消息的数组。

CREATE TABLE 'tbl_message'('id' int(10) AUTO_INCREMENT,
  'from_user' int(10),
  'to_user' int(10),
  'reply_to' int(10),
  'subject',
  'body' text,
  'status' tinyint(3),
  'deleted_from_sender' tinyint(3),
  'deleted_from_recipient' tinyint(3)',
  'created_on' datetime,

我写了查询:

SELECT * FROM tbl_message s1 WHERE s1.created_on IN (
   SELECT MAX(s2.created_on)
      FROM tbl_message s2 WHERE s1.from_user=".$userID." OR s2.to_user=".$userID."
      GROUP BY s2.from_user, s2.to_user) 
       AND status = 0";

这很好,但给了我来自 from_user 和 to_user 的 2 条最后一条消息,而不是来自两者的 1 条最后一条消息。那当然是因为 GROUP BY,现在的问题是我如何在子查询中找到 max created_on(实际上是 mysql 日期戳)?或任何其他解决方案将不胜感激。 感谢任何帮助或建议。

经过2天挖掘stackoverflow和mysql手册希望DB prof的帮助:)

更新: 例如一些数据

+----+-------+--------+--------+---------------------+--------+---------+
| id | from_user | to_user | subject      | created_on          | status |
+----+-------+--------+--------+---------------------+--------+---------+
|  1 |   68      |   128   | somesubject1 | 2013-07-01 21:31:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  2 |    128    |   68    | somesubject2 | 2013-07-01 21:41:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  3 |    128    |   68    | somesubject3 | 2013-07-01 21:51:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  4 |    68     |   226   | somesubject4 | 2013-07-01 22:01:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+

查询的输出

|  3 |    128    |   68    | somesubject3 | 2013-07-01 21:51:29 |      0 |
+----+-------+--------+--------+---------------------+--------+---------+
|  4 |    68     |   226   | somesubject4 | 2013-07-01 22:01:29 |      0 |

【问题讨论】:

  • 你能用示例数据和期望的结果填写它并发布更新的小提琴吗? sqlfiddle.com/#!2/ac316 -- 这将帮助我们得到您的答案。
  • 能否请您不要在已知托管恶意软件的网站上发布图片? google.com/safebrowsing/diagnostic?site=radikal.ru
  • sgeddes 已更新。 Oerd 抱歉,它只是一个图像托管,应该没有恶意软件
  • @Alekso - 有多种方法可以将恶意软件提供给客户端/浏览器,包括将其嵌入图像本身。现在,图像插件中的大部分漏洞都已得到处理,但还有其他方法——例如,在标题中引用一个 javascript 文件,即使它执行,也不一定会“显示”给访问者。并且实际上并没有“只是获取图像”之类的东西 - 有一个完整的文件传输协议,它可能是可利用的(虽然不经常在打补丁的机器上)。
  • 好的,我删除了链接,为此道歉!

标签: mysql sql


【解决方案1】:

您可以使用此查询来获取两个用户之间的最长 created_on 日期:

SELECT
  LEAST(from_user, to_user) user1,
  GREATEST(from_user, to_user) user2,
  MAX(created_on) max_created_on
FROM
  tbl_message
GROUP BY
  LEAST(from_user, to_user),
  GREATEST(from_user, to_user)

您要查找的查询可能是这样的:

SELECT t.*
FROM
  tbl_message t INNER JOIN (
    SELECT
      LEAST(from_user, to_user) user1,
      GREATEST(from_user, to_user) user2,
      MAX(created_on) max_created_on
    FROM
      tbl_message
    WHERE from_user=68 or to_user=68
    GROUP BY
      LEAST(from_user, to_user),
      GREATEST(from_user, to_user)) M
  on t.created_on = M.max_created_on
     AND LEAST(t.from_user, t.to_user)=user1
     AND GREATEST(t.from_user, t.to_user)=user2

请参阅两个查询here

【讨论】:

  • grazie mille!:) 非常感谢你,这是有效的,只是为了澄清功能将如何影响性能?
  • @Alekso prego :) 我认为最小和最大应该能够使用索引,所以性能应该不错......还有其他选择,但我没有相信他们更快......
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2013-03-22
  • 2014-03-02
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多