我是SQL新手,请帮我解决问题。
我有一个用于站点私人消息的表,这是我在引擎之间迁移后得到的(phpbb 到 drupal)
可以说,它有 3 列:
- mid - 用于消息 ID
- 线程- 用于线程 ID
- 收件人- 用户 ID,谁将收到消息。
每条消息都显示在收件人和作者的邮箱中,所以每条消息我都有 2 个字符串。
问题是消息的线程ID 不正确(基本上,它们等于mid),因此 2 个用户之间的对应关系显示为一百个单独的线程。
例如:
user 100 wrote message to user 101
user 101 replied to user 100
user 102 wrote message to user 100
该表如下所示:
________________________________
| mid | thread | recipient |
| | | |
| 1 | 1 | 101 | ← message 1 in recipient's mailbox
| 1 | 1 | 100 | ← message 1 in author's mailbox
| 2 | 2 | 100 | ...
| 2 | 2 | 101 |
| 3 | 3 | 100 |
| 3 | 3 | 102 |
|________|___________|___________|
我的目标是为具有相同接收者对的每组对行提供相同的线程 ID:
________________________________
| mid | thread | recipient |
| | | |
| 1 | 1 | 101 | }
| 1 | 1 | 100 | } Correspondence between 100 and 101 must
| 2 | 1 | 100 | } have the same thread id (1)
| 2 | 1 | 101 | }
| 3 | 2 | 100 |
| 3 | 2 | 102 |
|________|___________|___________|
更新:
对于同一收件人对之间的所有当前对话,线程 ID 必须相同。(不用担心进一步的对话,用户可以选择在写消息时打开新线程,这将生成新线程 id,或者在现有线程中回复,这将使用现有线程 id 标记消息。我想要的只是收集线程中每 2 个用户之间的现有消息吨数)。
我想像某种循环一样,它将搜索每个中间的所有收件人 ID,并在升序排序后将它们合并到数组中:
- 中间 1: (100, 101)
- 中间 2: (100, 101)
- 中间 3: (100, 102)
然后为相同的数组提供相同的 id,这将是我想要的线程 id:
- (100, 101) = 1
- (100, 101) = 1
- (100, 102) = 2
不确定,如果我的算法仅适用于 SQL 查询