Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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_Sql - Fatal编程技术网

Mysql SQL将两列分组并选择最近的日期/时间戳

Mysql SQL将两列分组并选择最近的日期/时间戳,mysql,sql,Mysql,Sql,所以我有一张叫做电话留言的桌子。这是我编写的一个示例查询。我要做的是将具有character\u id 22或target\u character\u id 22的行组合在一起。因为在数据库中存储的每个phone_消息中有两个条目。基本上是电话交谈。我想做的是让小组获得每个小组发送的最后一条消息 我的原始查询: SET @character_id = 22; SET @t = 'text'; SELECT character_id, target_character_id, message,

所以我有一张叫做电话留言的桌子。这是我编写的一个示例查询。我要做的是将具有character\u id 22或target\u character\u id 22的行组合在一起。因为在数据库中存储的每个phone_消息中有两个条目。基本上是电话交谈。我想做的是让小组获得每个小组发送的最后一条消息

我的原始查询:

SET @character_id = 22;
SET @t = 'text';

SELECT character_id, target_character_id, message, `type`, MAX(`date`) date FROM
    `phone_messages`
WHERE
    (
        `character_id`=@character_id
    ) AND `type`=@t
GROUP BY
    character_id, target_character_id


我对此的期望输出是

character_id | target_character_id | message | type | date
"33"    "22"    "perfect see you then"  "text"  "2020-08-25 23:28:43"
"22"    "57"    "the tool shop down south"  "text"  "2020-09-05 19:05:45"

我该怎么做呢?对不起,我对我的问题缺乏理解。

我只是想确认一下

  • 每对呼叫者(其中一人为“22”)
  • 你想得到最新的文本,无论是哪种方式(从22到22)
这里的答案使用以下方法

  • 对于每一行,确定另一方(在查询中称为
    second\u character\u id
  • 对于其他各方,根据发送日期对“文本”行进行排序
  • 获取每一方的最新行
在这个答案中,我还包括了
主要字符\u id
——在本例中始终是22——以防您希望将其扩展为多人

下面是一个关于数据设置和方法的示例


请注意,在底部还有一个额外的查询-这是我之前的尝试,我误解了需求。在该答案中,它将查找到22的最新“传入”和最新“传出”文本,而不管它们来自谁。

如果您想要每对的最新消息,无论顺序如何,那么您可以使用
行号()
最小值()
最大值()

character_id | target_character_id | message | type | date
"33"    "22"    "perfect see you then"  "text"  "2020-08-25 23:28:43"
"22"    "57"    "the tool shop down south"  "text"  "2020-09-05 19:05:45"
WITH Call_list AS
    (SELECT *,
        @character_id AS `primary_character_id`,
        CASE 
            WHEN `character_id` = @character_id THEN `target_character_id`
            ELSE `character_id` END AS `second_character_id`
    FROM
        `phone_messages`
    WHERE
        (`character_id`= @character_id OR `target_character_id`= @character_id)
        AND (`type`= @t )
    ),
Sorted_Call_List AS
    (SELECT *,
            ROW_NUMBER() OVER 
                (PARTITION BY `primary_character_id`, `second_character_id` 
                ORDER BY `Date` DESC
                ) AS char_rn
    FROM Call_list
    )
SELECT `character_id`, `target_character_id`, `message`, `type`, `date`
FROM   Sorted_Call_List
WHERE  char_rn = 1;
SET @character_id = 22;
SET @t = 'text';

SELECT pm.*
FROM (SELECT pm.*,
           ROW_NUMBER() OVER (PARTITION BY LEAST(character_id, target_character_id), GREATEST(character_id, target_character_id)
                              ORDER BY date DESC
                             ) as seqnum
      FROM phone_messages pm
      WHERE character_id = @character_id AND
            type = @t
     ) pm
WHERE seqnum = 1;