# 飞书群消息查询示例

## 数据库表结构

`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;
```
