在尝试进行查询以将消息分组到会话中时,我遇到了一个小问题。这样,具有相同发送者和接收者的消息将出现在同一会话中。也会有小组对话,这意味着两个人和两个人一起说话就像四个人一样。
我的数据库表如下所示:
表: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 |
+----+------+----+---------+---------+
我已经尝试了下面的方法,但是我得到了所有的消息,所以我需要创建一个group by,让它们放在一行中,而不是让同一个对话有多个行。
SELECT * FROM messages
因此,基本上需要做的是根据以下内容进行分组:
from
和to
与其他行相等,而group_1
和group_2
= 0。但它还应该对to
与其他行from
相等的行进行分组,反之亦然,但仍然是在group_1
和group_2
=0时。(与上表中的前两行类似)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
。它应该像用户会话一样对组会话进行分组(其中定义了from
和to
)。
当为to = 0
时,您可以看到行是一个组。如果为to != 0
,则它不是一个组。
它应该像用户一样对group_1
和group_2
进行分组。
发布于 2013-04-25 12:08:20
这是我的提案;
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
发布于 2013-04-25 08:08:43
你要找的是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
)
我希望这将帮助你朝着正确的方向前进。
https://stackoverflow.com/questions/16209295
复制