Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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从每个对话中选择最后一条消息_Mysql_Sql_Datetime_Message - Fatal编程技术网

mySQL从每个对话中选择最后一条消息

mySQL从每个对话中选择最后一条消息,mysql,sql,datetime,message,Mysql,Sql,Datetime,Message,我有一个用户表,其中存储了用户发送/接收的所有消息: id | data_type | user_name | body | datetime 我想要实现的是: 1) 从每个对话中选择最后一行,即数据类型为1(已接收消息)或2(已发送消息)的表中每个唯一用户名的最后插入行 2) 仅获取早于特定日期时间的行,即datetime

我有一个用户表,其中存储了用户发送/接收的所有消息:

id | data_type | user_name | body | datetime
我想要实现的是:

1) 从每个对话中选择最后一行,即数据类型为1(已接收消息)或2(已发送消息)的表中每个唯一用户名的最后插入行

2) 仅获取早于特定日期时间的行,即datetime 有人知道我怎样才能做到这一点吗?这超出了我的专业水平

这就是我到目前为止所做的:

SELECT MAX(id) as id, body, user_name 
FROM user_harry
WHERE data_type = 1 OR data_type = 2
GROUP BY user_name
它返回正确的行的最后一个id,但正文不是该行的id。
谢谢你的帮助

如果现有查询生成了所需的正确ID值,则应获得该ID值以及与这些行关联的正文值:

select y.*
  from (select max(id) as max_id, user_name
          from user_harry
         where data_type in (1, 2)
         group by user_name) x
  join user_harry y
    on x.max_id = y.id
   and x.user_name = y.user_name

如果现有查询生成了所需的正确ID值,则应获得该ID值以及与这些行关联的正文值:

select y.*
  from (select max(id) as max_id, user_name
          from user_harry
         where data_type in (1, 2)
         group by user_name) x
  join user_harry y
    on x.max_id = y.id
   and x.user_name = y.user_name
我希望它能起作用

SELECT user_harry.*
FROM user_harry INNER JOIN (
    SELECT MAX(id) as max_id, user_name 
    FROM user_harry
    WHERE data_type IN(1,2)
    GROUP BY user_name
) temptable ON user_harry.id = temptable.max_id AND user_harry.user_name = temptable.user_name
Ahmet Vehbi Olgaç

我希望它能起作用

SELECT user_harry.*
FROM user_harry INNER JOIN (
    SELECT MAX(id) as max_id, user_name 
    FROM user_harry
    WHERE data_type IN(1,2)
    GROUP BY user_name
) temptable ON user_harry.id = temptable.max_id AND user_harry.user_name = temptable.user_name

Ahmet Vehbi Olgaç

这与我发布的查询完全相同,只是你称子查询为“可诱惑的”而不是“x”,如果你可以使用
,其中数据类型介于1和2之间,然后是
上的复合索引(数据类型,用户名,id)
将使这个内部查询执行得非常出色。这与我发布的查询完全相同,只是您将子查询称为“可诱惑的”,而不是“x”,如果您可以使用
中的数据类型介于1和2之间,则使用
上的复合索引(数据类型、用户名、id)
将使此内部查询执行得非常出色。此问题每天都会被询问(并正确回答)。单身。在SO(和其他地方)的一天:-(是的,我看到很多,但我找不到一个使用一列存储收件人用户id的。这个问题每一天都会被问(并正确回答)。在SO(和其他地方):-(是的,我看到很多,但我找不到一个使用一列存储收件人用户id的。