以先进的方式集团化

时间:2013-04-25 07:56:24

标签: mysql sql group-by

我在尝试进行查询以将消息分组到对话时遇到了一些问题。 因此,具有相同发送方和接收方的消息将在同一对话中。 同样会有小组对话,这意味着两个人和两个人一起交谈四个。

我的数据库表如下所示:

表: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

所以基本上需要做的是按以下方式分组:
  - 将fromto与其他行等于的行组对话,而group_1group_2 = 0.但它也应该将这些行分组到to与其他行from相同,反之亦然,但仍然group_1group_2 = 0.(就像上表中的第2行)   - 将group_1group_2与其他行等于的行组对话,to = 0,以及group_1与其他行group_2相等的行对话,反之亦然,但仍然to = 0.(就像id为3和4的行)

所以基本上它应该将群组正在彼此交谈的所有消息分组,以及用户彼此交谈的地方。

修改

更好地解释group_1group_2

group_1group_2是为了让我可以将用户放入群组中,并使群组能够与其他群组通话。

因此,他们不使用tofrom,而是使用group_1group_2。 它应该像用户对话一样对组会话进行分组(定义{{​​1}}和from)。

to时,您可以看到一行是一个群组。当to = 0时,它不是一个群组。

它应该是GROUP to != 0group_1,就像用户一样。

2 个答案:

答案 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
)

我希望这会帮助你朝着正确的方向前进。