Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 最近消息的SQL查询_Mysql - Fatal编程技术网

Mysql 最近消息的SQL查询

Mysql 最近消息的SQL查询,mysql,Mysql,我正在尝试实现一个与facebook非常相似的消息系统。消息表为: +--------+----------+--------+-----+----------+ | msg_id | msg_from | msg_to | msg | msg_time | +--------+----------+--------+-----+----------+ 此处msg_from和msg_to包含用户ID,msg_time包含消息的时间戳。用户的用户id可以同时出现在“收件人”和“发件人”列中,也可

我正在尝试实现一个与facebook非常相似的消息系统。消息表为:

+--------+----------+--------+-----+----------+
| msg_id | msg_from | msg_to | msg | msg_time |
+--------+----------+--------+-----+----------+

此处
msg_from
msg_to
包含用户ID,
msg_time
包含消息的时间戳。用户的用户id可以同时出现在“收件人”和“发件人”列中,也可以多次出现在其他用户的“收件人”和“发件人”列中。我应该如何编写一个SQL查询来选择两个用户之间最近发送的消息?(消息可以来自其中一个)1到2或2到1

经过深思熟虑,我想到了这个:

SELECT min_user AS min(msg_from, msg_to), max_user AS max(msg_from, msg_to), 
max(msg_date) FROM msg GROUP BY min_user, max_user
我仍然不太确定如何从消息中获取附加数据,但我会考虑一下。

会这么简单吗

输出:

| MSG_ID | MSG_FROM | MSG_TO |         MSG |                      MSG_TIME |
----------------------------------------------------------------------------
|      2 |     Paul |   John | Hey Johnny! | August, 20 2012 00:00:00-0700 |
|      1 |     John |   Paul | Hey Paulie! | August, 19 2012 00:00:00-0700 |
| MSG_ID | MSG_FROM | MSG_TO |    MSG |                       MSG_TIME |
------------------------------------------------------------------------
|      1 |        1 |      2 |  hello | January, 23 2010 17:00:00-0800 |
|      5 |        1 |      3 | me too | January, 23 2012 00:15:00-0800 |
|      6 |        3 |      2 |  hello | January, 23 2012 01:12:12-0800 |

如果MySQL只支持窗口功能,可能会简单得多:


既然吴宇森澄清了这不是方向性的,下面是我的新答案:

select *
from msgsList
where (least(msg_from, msg_to), greatest(msg_from, msg_to), msg_time)       
in 
(
    select 
       least(msg_from, msg_to) as x, greatest(msg_from, msg_to) as y, 
       max(msg_time) as msg_time
    from msgsList 
    group by x, y
);
输出:

| MSG_ID | MSG_FROM | MSG_TO |         MSG |                      MSG_TIME |
----------------------------------------------------------------------------
|      2 |     Paul |   John | Hey Johnny! | August, 20 2012 00:00:00-0700 |
|      1 |     John |   Paul | Hey Paulie! | August, 19 2012 00:00:00-0700 |
| MSG_ID | MSG_FROM | MSG_TO |    MSG |                       MSG_TIME |
------------------------------------------------------------------------
|      1 |        1 |      2 |  hello | January, 23 2010 17:00:00-0800 |
|      5 |        1 |      3 | me too | January, 23 2012 00:15:00-0800 |
|      6 |        3 |      2 |  hello | January, 23 2012 01:12:12-0800 |
对于此输入:

create table msgsList
(
  msg_id int,
  msg_from int, 
  msg_to int,
  msg varchar(10),
  msg_time datetime
);

insert into msgslist VALUES

(1, 1, 2, 'hello', '2010-01-23 17:00:00'),      -- shown
(2, 2, 1, 'world', '2010-01-23 16:00:00'),

(3, 3, 1, 'i am alive', '2011-01-23 00:00:00'),
(4, 3, 1, 'really', '2011-01-22 23:15:00'),
(5, 1, 3, 'me too', '2012-01-23 00:15:00'),     -- shown

(6, 3, 2, 'hello', '2012-01-23 01:12:12');      -- shown

如果你喜欢ANSI SQL,那么以下是方法:


对于任何类似这样的复杂查询,请使用TDQD-测试驱动的查询设计。一步一步地设计答案,步骤的大小取决于你的经验和你对问题的理解程度

步骤1-查找给定用户之间最新消息的时间 在整个过程中,我假设用户ID是整数;我使用的是1000和2000的值

SELECT MAX(msg_time) AS msg_time
  FROM message
 WHERE ((msg_to = 1000 AND msg_from = 2000) OR
        (msg_to = 2000 AND msg_from = 1000)
       )
步骤2-查找与最新消息对应的记录 如果这些字符之间碰巧有两条(或更多)具有相同最新时间戳的消息,那么它们都将被选中;目前还没有在两次碰撞之间做出选择的依据。如果您认为这是一个问题,您可以使用上面的查询(作为子查询)安排查找
MAX(msg\u id)


警告:未使用任何DBMS对代码进行正式测试。

这将为一对选择多个值。这对是独一无二的。这一对的顺序是否改变并不重要。可以有多条消息。我只需要最新的消息。好的,那么你添加限制1,但这不会给我其他唯一的消息对。我只买一双。一个用户接收来自多个用户的消息。我需要所有唯一对的最新消息。对不依赖于方向。此sql语句是否可以回答这组记录?隐马尔可夫模型。。我把OP的要求理解为只返回两个用户之间最近的对话:-)因此只需要两个参数在查询时,它应该只返回
msgid=2
,因为它是最新的,消息可以由
John发送给Paul
Paul发送给John
,我理解你在SQLFiddle链接上的意思:我会想出一个解决方案:-)不要将此视为负面评论,但我认为OP需要从用户那里获得所有MSG。如果他只需要两个值,我明白你的意思。如果他想检索许多用户的对话,比如我提供的链接,该怎么办?老实说,我一直在搜索代码片段如何获得结果,其中
peter和north
north和peter
相同:顺便说一句,你是皮诺吗?呵呵
+1
使用
最少的
最大的
就像做梦一样!!谢谢!!
SELECT MAX(msg_time) AS msg_time
  FROM message
 WHERE ((msg_to = 1000 AND msg_from = 2000) OR
        (msg_to = 2000 AND msg_from = 1000)
       )
SELECT m.*
  FROM message AS m
  JOIN (SELECT MAX(msg_time) AS msg_time
          FROM message
         WHERE ((msg_to = 1000 AND msg_from = 2000) OR
                (msg_to = 2000 AND msg_from = 1000)
               )
       ) AS t
    ON t.msg_time = m.msg_time
 WHERE ((m.msg_to = 1000 AND m.msg_from = 2000) OR
        (m.msg_to = 2000 AND m.msg_from = 1000)
       )
SELECT m2.*
  FROM message AS m2
  JOIN (SELECT MAX(m.msg_id) AS msg_id
          FROM message AS m
          JOIN (SELECT MAX(msg_time) AS msg_time
                  FROM message
                 WHERE ((msg_to = 1000 AND msg_from = 2000) OR
                        (msg_to = 2000 AND msg_from = 1000)
                       )
               ) AS t
            ON t.msg_time = m.msg_time
         WHERE ((m.msg_to = 1000 AND m.msg_from = 2000) OR
                (m.msg_to = 2000 AND m.msg_from = 1000)
               )
       ) AS i
    ON i.msg_id = m2.msg_id