# 飞书群消息查询示例 ## 数据库表结构 `lark_group_message` 表包含以下关键字段: | 字段 | 类型 | 说明 | |------|------|------| | `message_id` | varchar(128) | 消息唯一ID(om_xxx) | | `quote_message_id` | varchar(128) | 引用消息ID — 当消息是引用回复时,记录被引用消息的 `message_id` | | `parent_id` | varchar(128) | 父消息ID(话题根消息,预留字段) | | `root_id` | varchar(128) | 根消息ID(话题根消息,预留字段) | | `sender_id` | varchar(128) | 发送者ID(open_id) | | `sender_name` | varchar(255) | 发送者显示名称 | | `msg_type` | varchar(32) | 消息类型(text/post/image/media/audio/file/sticker) | | `content` | text | 消息文本内容或描述 | | `media_url` | varchar(1024) | 媒体文件COS URL | | `msg_time` | datetime | 消息发送时间 | | `msg_timestamp` | bigint | 消息时间戳(毫秒) | ## 引用回复关系 ### 数据来源 飞书中用户点击"回复"某条消息时,lark-cli 返回的消息数据中包含 `reply_to` 字段(字符串类型,值为被引用消息的 `message_id`)。同步脚本提取后存入 `quote_message_id` 字段。 ### 判断一条消息是否是引用回复 ```sql -- quote_message_id 不为 NULL 的消息就是引用回复 SELECT * FROM lark_group_message WHERE quote_message_id IS NOT NULL; ``` ### 与微信数据表的对应关系 | 飞书表字段 | 微信表字段 | 类型差异 | 说明 | |-----------|-----------|---------|------| | `message_id` (varchar) | `svr_msg_id` (bigint) | 飞书是字符串、微信是数字 | 消息唯一标识 | | `quote_message_id` (varchar) | `refer_msg_svrid` (bigint) | 飞书是字符串、微信是数字 | 被引用消息的ID | 两张表的引用关系逻辑完全一致: - 飞书:`quote_message_id` 指向被引用消息的 `message_id` - 微信:`refer_msg_svrid` 指向被引用消息的 `svr_msg_id` --- ## 引用回复查询 ### 1. 查询某条消息的所有回复 ```sql -- 查询某条消息被哪些消息引用回复了 SELECT message_id, sender_name, content, msg_time FROM lark_group_message WHERE quote_message_id = 'om_xxx' ORDER BY msg_timestamp; ``` ### 2. 查询完整对话链(原消息 + 所有回复) ```sql SELECT message_id, sender_name, content, media_url, msg_time, CASE WHEN quote_message_id IS NULL THEN '📝 原消息' ELSE CONCAT('↳ 回复 ', quote_message_id) END AS message_role FROM lark_group_message WHERE message_id = 'om_xxx' OR quote_message_id = 'om_xxx' ORDER BY msg_timestamp; ``` ### 3. 多级引用链追溯(A → B → C) 当存在多级引用时(C 引用 B,B 引用 A),需要递归查询: ```sql -- 第一步:找到目标消息(起点) SELECT message_id, sender_name, content, quote_message_id, msg_time FROM lark_group_message WHERE message_id = 'om_目标消息ID'; -- 第二步:向上追溯(找到被引用的原消息) SELECT message_id, sender_name, content, quote_message_id, msg_time FROM lark_group_message WHERE message_id = '上一步的quote_message_id'; -- 第三步:向下展开(找到引用目标消息的所有回复) SELECT message_id, sender_name, content, quote_message_id, msg_time FROM lark_group_message WHERE quote_message_id = 'om_目标消息ID' ORDER BY msg_timestamp; ``` ### 4. 统计热门话题(被回复最多的消息) ```sql SELECT m1.message_id, m1.sender_name, LEFT(m1.content, 80) AS content_preview, m1.msg_time, COUNT(m2.id) AS reply_count FROM lark_group_message m1 INNER JOIN lark_group_message m2 ON m1.message_id = m2.quote_message_id WHERE m1.chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26' AND m1.msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY m1.message_id ORDER BY reply_count DESC LIMIT 10; ``` ### 5. 查看某人发出的消息中,哪些收到了回复 ```sql SELECT m1.message_id, LEFT(m1.content, 60) AS original_content, m1.msg_time, COUNT(m2.id) AS reply_count, GROUP_CONCAT(m2.sender_name SEPARATOR ', ') AS replied_by FROM lark_group_message m1 INNER JOIN lark_group_message m2 ON m1.message_id = m2.quote_message_id WHERE m1.sender_name = '胡陈辰' GROUP BY m1.message_id ORDER BY m1.msg_timestamp DESC; ``` --- ## 常用查询 ### 6. 查询最近7天的所有消息 ```sql SELECT message_id, sender_name, msg_type, content, media_url, quote_message_id, msg_time FROM lark_group_message WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26' AND msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY msg_timestamp DESC; ``` ### 7. 按消息类型统计 ```sql SELECT msg_type, COUNT(*) AS count FROM lark_group_message WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26' AND msg_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY msg_type ORDER BY count DESC; ``` ### 8. 关键词搜索 ```sql SELECT message_id, sender_name, content, quote_message_id, msg_time FROM lark_group_message WHERE chat_id = 'oc_fabff7672e62a9ced7b326ee4a286c26' AND content LIKE '%闪退%' ORDER BY msg_timestamp DESC; ```