gpt4 book ai didi

mysql - 使用子查询和或进行内连接

转载 作者:行者123 更新时间:2023-11-29 13:18:09 24 4
gpt4 key购买 nike

我正在建立一个包含多个对话的聊天,并且有一个任务从每个对话中提取最新消息。我所说的对话是指来自或发往特定用户的消息。 (它由 fromidtoid 列定义)。

我的计划:

1) 提取对话 ID

2)提取消息本身

根据此处对类似问题的回答,我构建了这个无法执行的查询(“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本对应的手册,以获取在 'WHERE fromid 附近使用的正确语法” != 4 LIMIT 10) table2 ON (table2.VALIDID = `support_chat_message' at line 1")

我的查询是

SELECT `fromid`, `toid`, `message`, `sendat`, `messageid` 
FROM `support_chat_messages` INNER JOIN
(SELECT `fromid` as VALIDID
FROM `support_chat_messages`
GROUP BY `fromid`
WHERE `fromid` != 4 LIMIT 10) table2
ON (table2.VALIDID = `support_chat_messages`.`fromid`)
OR (table2.VALIDID = `support_chat_messages`.`toid`) ORDER BY `messageid`

一些解释:

1) 我选择 fromid 并通过同一字段将它们分组以获取对话(=用户 ID)。用户 ID 名为 VALIDID

2) 其中 fromid != 4 表示不是来 self 的消息(仅是其他用户 ID)。

3) 限制 10 - 不超过 10 次对话。

4) 我在表 support_chat_messages 中搜索从选定用户 ( table2.VALIDID = support_chat_messages.fromid ) 或发送到选定用户 ( table2.VALIDID = support_chat_messages.toid ) 发送的消息

查询有什么问题?

如何限制查询?我需要从每次对话中获取最新消息。如果我在末尾设置限制 1,我将只获得最新的对话,而不是每个对话中的 1 个。

你知道如何优化吗?我将每 2 秒刷新一次,这样的查询会严重加载系统。我有一个想法使用 groupby (fromid 或 toid)而不加入 join,但不确定这样的表达式是否有效。

感谢您的帮助。

这是一个相同的 fiddle 。 sqlfiddle.com/#!2/796c4/4/0

想要的结果是这样的...

对话为(7 和 4)、(6 和 4)、(5 和 4)、(2 和 4),每条最重要的消息为(22)、(21)、(20)、(18)

最佳答案

SELECT x.* 
FROM support_chat_messages x
JOIN
( SELECT fromid
, MAX(sendat) max_sendat
FROM support_chat_messages
WHERE fromid != 4
GROUP
BY fromid
) y
ON y.fromid = x.fromid
AND y.max_sendat = x.sendat;

http://sqlfiddle.com/#!2/796c4/6

关于mysql - 使用子查询和或进行内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206461/

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