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