2015-05-05 55 views
0

加入了兩次參考假設我有兩個表:數查詢由不同的外鍵

Users 
id: integer 
name: string 

Messages 
id: integer 
sender_id: integer 
receiver_id: integer 
body: string 

我需要發送和接收信息的統計爲所有用戶。

發送郵件時我的查詢按預期工作:

SELECT users.id, COUNT(*) total_sent 
FROM users 
LEFT OUTER JOIN messages sent_messages ON sent_messages.sender_id = users.id 
GROUP BY users.id; 

+----+------------+ 
| id | total_sent | 
+----+------------+ 
| 1 |   3 | 
| 2 |   2 | 
| 3 |   1 | 
+----+------------+ 

但是我需要擴大查詢,並在同一時間獲得接收的消息的數量。我的嘗試是:

SELECT users.id, COUNT(sent_messages.id) total_sent, COUNT(received_messages.id) total_received 
FROM users 
LEFT OUTER JOIN messages sent_messages ON sent_messages.sender_id = users.id 
LEFT OUTER JOIN messages received_messages ON received_messages.receiver_id = users.id 
GROUP BY users.id; 

不幸的是,它會產生錯誤的結果。

+0

如果你喜歡,請考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做,請提供適當的DDL(和/或sqlfiddle),以便我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

+1

嘗試COUNT(不同的sent_messages.id)和COUNT(不同的received_messages.id)。 – jarlh

+0

@jarlh - 它做的工作:)謝謝! – Jacka

回答

3

你可以指望不同receiver_id總髮送的消息和獨特的sender_id收到信息

SELECT u.id, COUNT(distinct s.receiver_id) total_sent, 
COUNT(distinct r.sender_id) total_received 
FROM users u 
LEFT OUTER JOIN messages s ON s.sender_id = u.id 
LEFT OUTER JOIN messages r ON r.receiver_id = u.id 
GROUP BY u.id; 

DEMO

0

我希望這將幫助你:

select u.id, r.total_received, s.total_sent from users as u left outer join (select count(id) as total_received, receiver_id from Messages group by receiver_id) as r on r.receiver_id =u.id left outer join (select count(id) as total_sent, sender_id from Messages group by sender_id) as s on sender_id=u.id