2012-04-25 116 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