2016-05-17 4 views
2

Tabelle Nachrichten (zB von Log-Meldungen von einem Benutzer zum anderen):SQL: Wie aggregieren mehrere Zeilen nach austauschbaren Spalten?

| id | from_user_id | to_user_id | message_body | 
| 1 |  7  |  10  |  ...  | 
| 2 |  3  |  1  |  ...  | 
| 3 |  95  |  14  |  ...  | 
| 4 |  95  |  3  |  ...  | 
| 5 |  1  |  3  |  ...  | 
| 6 |  1  |  3  |  ...  | 
| 7 |  10  |  7  |  ...  | 
| 8 |  3  |  95  |  ...  | 
... 

Ich möchte, wie viele Benutzer Gespräch in dieser Tabelle Ich muss COUNT (andere Aggregatfunktion oder ausführen). Eine Konversation ist definiert als eine Nachricht von A nach B ODER von B nach A. Beachten Sie, dass die Reihenfolge nicht als zählt die IDs sind miteinander austauschbar.

Also, das Ergebnis Ich mag würde bekommen, ist:

Tabelle GESPRäCHE:

| id | user_id_1 | user_id_2 | messages_count | 
| 1 |  7  |  10 |  2  | 
| 2 |  3  |  1 |  3  | 
| 3 | 95  |  14 |  1  | 
| 4 | 95  |  3 |  2  | 
... 

Wie würde ich in der Lage sein, dies zu tun, um eine SQL-Abfrage verwenden?

Antwort

3

Eine Option ist least und greatest zu verwenden:

select least(from_user_id, to_user_id) user_id_1, 
     greatest(from_user_id, to_user_id) user_id_2, 
     count(*) 
from messages 
group by 1, 2 
0
SELECT user1, 
     user2, 
     COUNT(*) as messageCount 
FROM 
(
    SELECT from_user_id as user1, 
     to_user_id as user2 
    FROM T 
    WHERE from_user_id<= to_user_id 
    UNION ALL 
    SELECT to_user_id as user1, 
     from_user_id as user2 
    FROM T 
    WHERE from_user_id> to_user_id 
) as T1 
GROUP BY user1,user2 

SQLfiddle demo