2012-04-07 11 views
1

Wie würde ich die Summe des gemeinsamen Feldes hier bekommen?Summe des Feldes in 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 

Mit anderen Worten: Ich möchte bekommen SUM(mutual) für (first_user_id + second_user_id) in denen die gegenseitige = 1.

Antwort

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; 

Die Frage im Kommentar fragt:

Wie Würde ich die Einträge loswerden, wo gegenseitige = 0?

eine Filterbedingung verwenden, wie üblich:

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; 

Der Optimierer kann auch den Zustand nach unten in die UNION-Abfragen schieben, so dass es wie ausführen würde, wenn die Abfrage geschrieben wurde:

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; 

Das Nettoergebnis ist natürlich das gleiche.

+0

Vielen Dank, und wie würde ich Einträge, wo gegenseitige = 0? – David542

+1

Behandle die Unterauswahl als Tabelle. Verwende 'WHERE u.Mutual> 0', um unerwünschte Einträge herauszufiltern. – 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