2012-04-07 14 views
1

ここで相互フィールドのSUMを取得するにはどうすればよいですか?私は(first_user_id + second_user_id)についてSUM(mutual)を取得したい言い換えればSQL UNIONのフィールドの合計を取得

SELECT first_user_id, mutual 
    FROM userprofile_usercontact 
UNION ALL 
SELECT second_user_id, mutual 
    FROM userprofile_usercontact 
GROUP BY first_user_id 

どこ相互= 1

答えて

2
SELECT u.user_id, SUM(u.mutual) 
    FROM (SELECT first_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     UNION ALL 
     SELECT second_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     ) AS u 
GROUP BY user_id; 

コメントに質問を尋ねる:

方法相互= 0のエントリを削除しますか?フィルタ条件を使用

、いつものように:それはクエリが書かれていたかのように実行しますので、オプティマイザが良く、UNIONクエリにダウン状態をプッシュするかもしれない

SELECT u.user_id, SUM(u.mutual) 
    FROM (SELECT first_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     UNION ALL 
     SELECT second_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     ) AS u 
WHERE u.mutual != 0 -- or u.mutual <> 0 
GROUP BY user_id; 

SELECT u.user_id, SUM(u.mutual) 
    FROM (SELECT first_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     WHERE mutual != 0 
     UNION ALL 
     SELECT second_user_id AS user_id, mutual 
      FROM userprofile_usercontact 
     WHERE mutual != 0 
     ) AS u 
GROUP BY user_id; 

純粋な結果は、もちろん同じです。

+0

ありがとう、どうすれば相互= 0のエントリを削除できますか? – David542

+1

サブ選択を表として扱います。 'WHERE u.mutual> 0'を使って不要なエントリを取り除きます。 – vyegorov

0
Select sum(field) from (
    Select .... 
    Union all 
    Select .... 
) atable 
where .... 
1
SELECT SUM(mutual) sm, user_id FROM 
(SELECT first_user_id user_id, mutual 
    FROM userprofile_usercontact 
    UNION ALL 
    SELECT second_user_id, mutual 
     FROM userprofile_usercontact 
     GROUP BY first_user_id) s 

    GROUP BY user_id ORDER BY sm DESC 
関連する問題