2013-04-25 46 views
0

尝试执行查询将消息分组为对话时遇到了一些问题。 因此,具有相同发送者和接收者的消息将处于相同的对话中。 也会有小组对话,这意味着两个人和两个人一起说话四个。按高级方式分组

我的数据库表看起来像这样:

表: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。 它应该像用户对话(其中定义了from和)一样对组对话进行分组。

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

它应该与组别group_1group_2一样,就像用户一样。

回答

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 
+0

非常感谢。对于团队的解释抱歉,我编辑了我的问题,以便更好地解释它。另一件事,我会试着跟你查询,但它可以变成一个查询,而不是2? – 2013-04-25 12:27:36

+1

这样的事情? http://sqlfiddle.com/#!2/8f1ec/17 – dezza 2013-04-25 18:57:03

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 
) 

我希望这将帮助您在正确的方向。

+0

我与以下尝试:'GROUP BY messages.id HAVING( \t \t \t \t messages.group_1 = 0 AND \t \t \t \t messages.group_2 = 0 \t \t \t)',但它只与用户对话的消息一起出现,而不是用于群组。 – 2013-04-25 09:07:54