我在尝试进行查询以将消息分组到对话时遇到了一些问题。 因此,具有相同发送方和接收方的消息将在同一对话中。 同样会有小组对话,这意味着两个人和两个人一起交谈四个。
我的数据库表如下所示:
表:messages
+----+------+----+---------+---------+
| id | from | to | group_1 | group_2 |
+----+------+----+---------+---------+
| 1 | 1 | 2 | 0 | 0 |
| 2 | 2 | 1 | 0 | 0 |
| 3 | 1 | 0 | 1 | 2 |
| 4 | 2 | 0 | 2 | 1 |
| 5 | 3 | 0 | 1 | 2 |
| 6 | 4 | 0 | 2 | 1 |
| 7 | 4 | 1 | 0 | 0 |
| 8 | 1 | 4 | 0 | 0 |
+----+------+----+---------+---------+
我已经尝试了以下内容,但随后我将所有消息都删除了,所以我需要创建一个分组,使它们成为一行,而不是为同一个对话设置多行。
SELECT * FROM messages
所以基本上需要做的是按以下方式分组:
- 将from
和to
与其他行等于的行组对话,而group_1
和group_2
= 0.但它也应该将这些行分组到to
与其他行from
相同,反之亦然,但仍然group_1
和group_2
= 0.(就像上表中的第2行)
- 将group_1
和group_2
与其他行等于的行组对话,to
= 0,以及group_1
与其他行group_2
相等的行对话,反之亦然,但仍然to
= 0.(就像id为3和4的行)
所以基本上它应该将群组正在彼此交谈的所有消息分组,以及用户彼此交谈的地方。
修改
group_1
和group_2
group_1
和group_2
是为了让我可以将用户放入群组中,并使群组能够与其他群组通话。
因此,他们不使用to
和from
,而是使用group_1
和group_2
。
它应该像用户对话一样对组会话进行分组(定义{{1}}和from
)。
to
时,您可以看到一行是一个群组。当to = 0
时,它不是一个群组。
它应该是GROUP to != 0
和group_1
,就像用户一样。
答案 0 :(得分:1)
这是我的建议;
SELECT * FROM messages m GROUP BY m._from HAVING (m._to!=0 AND m.group_1=0 AND m.group_2=0)
SELECT * FROM messages m WHERE m.group_1=m._from OR m.group_2=m._to;
我也很难理解group_1和group_2的关系/目的。
单一查询(通过提问者的请求)
SELECT * FROM messages m WHERE m.group_1=m._from OR m.group_2=m._to OR m.group_1=0 AND m.group_2=0
答案 1 :(得分:0)
您要找的是GROUP BY <field> HAVING <condition>
。你的“需要做的事情”有点混乱,group_1和group_2也令人困惑。你正在寻找的东西可能是:
SELECT *
FROM messages m
GROUP BY m.from HAVING (
m.from = group_1 AND
m.to = group_2
)
我希望这会帮助你朝着正确的方向前进。