gpt4 book ai didi

php - 按仅显示第一条记录进行分组

转载 作者:行者123 更新时间:2023-11-29 21:07:03 25 4
gpt4 key购买 nike

我正在尝试获取数据库中的一些对话记录,但仅显示最新结果。我已经尝试过下面的方法,但是它按找到的第一条记录进行分组是否有一种方法可以使其按日期线列上的最后一条记录进行分组

  SELECT DISTINCT*
FROM table_messages
WHERE fromid=4 OR toid=4
GROUP BY convoid
ORDER BY dateline desc

我的表格如下

pmid - fromid - toid - convoid - dateline
1 4 15 3 1461079193
2 4 15 3 1461079200
3 15 4 3 1461079220
4 15 4 3 1461079230
5 4 15 3 1461079270

最佳答案

要在单个查询中获取特定用户的所有对话列表以及每个对话发送的最后一条消息(及其详细信息):

SELECT
convo.convoid,
message.pmid,
message.dateline,
CASE WHEN fromid = 4 then "SENT" ELSE "RECEIVED" as direction
FROM
(SELECT convoid, max(dateline) as maxdateline FROM table_messages GROUP BY convoid) convo
INNER JOIN table_messages message
ON convo.convoid = message.convoid AND
convo.maxdateline = message.dateline
WHERE
fromid = 4 or toid = 4

这里我们再次使用两组。第一个(来自 FROM)是所有 convoid 及其最大日期线 的列表。然后我们INNER JOIN那些具有相同表的convoid和dateline的关系。这将为我们提供每次对话及其最新消息的记录集。

然后,我们在 WHERE 子句中进行限制,以仅获取 fromidtoid 是您感兴趣的用户的对话.

为了好玩,我添加了 CASE 语句,只是为了引入有关最后发送的消息的更多信息(无论是由用户发送还是由用户接收)。

<小时/>

可能会更快:

SELECT
convo.convoid,
message.pmid,
message.dateline,
CASE WHEN fromid = 4 then "SENT" ELSE "RECEIVED" as direction
FROM
(SELECT convoid, max(dateline) as maxdateline FROM table_messages GROUP BY convoid WHERE fromid = 4 or toid = 4) convo
INNER JOIN table_messages message
ON convo.convoid = message.convoid AND
convo.maxdateline = message.dateline

取决于MySQL如何优化第一个查询。如果它尝试获取每个对话,然后获取最后一条消息,然后将其限制为用户,那么您可以强制优化器在此版本中仅获取用户的对话,然后获取这些对话的最新消息。但我敢打赌,这是一次洗礼,MySQL 会正确优化第一个查询,以执行第二个查询中明确规定的操作。但是……我想以防万一,我会把它放在这里。

出于可读性考虑,我更喜欢第一个查询,因为可以非常快速地查看主查询的 WHERE 子句中的条件。否则你必须在子查询中进行搜索。

关于php - 按仅显示第一条记录进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com