2012-04-25 27 views
4

次の表を参照してください。しかし、私は似たユーザー間の行をマージしたい2行を1つにマージする

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

:それはuser1がuser2のとの会話を(「AはBとの会話を開始し、5回」)を開始した回数を示します。だから、USER1:AとUser2:Bは、USER1と同じである:BとUser2:A、次のような結果につながる:

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

私が最初に考えたのは、行を追加し、PHP、それをループにテーブルを選択するようにしました結果を新しいテーブルにINSERTします。しかし、これは非常に重複しているようです(テーブルには何千ものレコードが含まれているためゆっくりとしています)。これは(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この行の圧縮を行う前に、@ Pr0noでクエリの絞り込みを計画していますか?もしそうなら、あなたはいくつかの障害にぶつかるでしょう。たとえば、上記のクエリでは、 'HAVING'ブロックを使用しない限り、' LEAST(user1、user2) 'にアクセスすることはできませんが、' WHEN'ブロックを使用しない限り、テーブル全体を掘り下げることはありません。ちょっと注意してください。 –

+0

+1円柱MIN()とMAX()、私はSyBaseであなたを愛していますよ! – MatBailie

+0

@RobertMartin - なぜあなたは 'LEAST()'を使うために 'HAVING'ブロックが必要であると示唆していますか? http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_least – MatBailie