2012-04-25 106 views
4

請考慮下表。它描述USER1多少次已開始與user2的對話(「A發起了與B,5倍」):將兩行合併爲一個

user1 user2 count 
------------------- 
A  B  5 
A  C  2 
B  A  6 
B  C  1 
C  A  9 
C  B  4 

不過,我想合併同類用戶之間的行。因此,用戶1:A和用戶2:B是一樣的用戶1:B和用戶2:A,導致以下結果:

user1 user2 count 
------------------- 
A  B  11 (5 + 6) 
A  C  11 (2 + 9) 
B  C  5 

我首先想到的是通過它來選擇表到PHP,環路,加行並將結果重新插入到新表中。但是這看起來很冗長(而且很慢,因爲表中包含數千條記錄)。這也可能與(My)SQL有關嗎?

回答

5
SELECT LEAST(user1, user2), GREATEST(user1, user2), SUM(count) AS count 
FROM yourtable 
GROUP BY LEAST(user1, user2), GREATEST(user1, user2) 
+0

@Pr0no你打算在做這一行壓縮之前做一些縮小的查詢嗎?如果是這樣,你會碰到一些障礙。例如,在上面的查詢中,除非使用'HAVING'塊,否則不會訪問'LEAST(user1,user2)',但除非使用'WHEN'塊,否則不會使用整個表。小心一點。 – 2012-04-25 19:50:02

+0

+1列MIN()和MAX(),哦,我怎麼會在SyBase中愛你! – MatBailie 2012-04-25 19:52:04

+0

@RobertMartin - 你爲什麼建議你需要'HAVING'塊來使用'最少()'? http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_least – MatBailie 2012-04-25 19:53:36