2013-09-27 55 views
1

因此,假設我有一個連接用戶的團隊/關係表,用戶可以加入的團隊以及團隊參與的挑戰(teams_users_challenges)以及存儲所有輸入數據的表用戶在給定的挑戰(entry_data)。我想獲得挑戰中每個用戶的平均分數(每週給定一週的平均值)。但是,用戶有可能以某種方式錯誤地加入多個團隊(這不應該發生,但有時會發生)。下面是SQL查詢低於獲取特定用戶的分數:在忽略重複項的情況下加入表格

SELECT tuc.user_id, SUM(ed.data_value)/7 as value 
FROM teams_users_challenges tuc 
LEFT JOIN entry_data ed ON (
    tuc.user_id = ed.user_id AND 
    ed.entry_date BETWEEN '2013-09-16' AND '2013-09-22' 
) 
WHERE tuc.challenge_id = ___ 
AND tuc.user_id = ___ 

如果用戶錯誤地加入了多個團隊,他(她)將有更多比teams_users_challenges一個條目,這基本上是複製數據檢索。因此,如果一個用戶在同一個挑戰中有3個不同的團隊,他將在teams_users_challenges中有3個條目,這將使他們的平均值value乘以3,這要歸功於自動獲取所有記錄的LEFT JOIN,而不僅僅是一個。

我試過使用GROUP BY,但這似乎並沒有將數據限制在teams_users_challenges中只有一個實例。有沒有人有任何想法,我可以如何限制查詢只在teams_users_challenges內取得一個記錄?

附錄:teams_users_challenges的列是team_iduser_id,和challenge_id

+0

加入與使用'GROUP BY'或'選擇DISTINCT'子查詢。 – Barmar

回答

1

如果這是一個新的空表,你可以表達你的「業務規則」,用戶只能加入一個團隊每次詢問的unique約束在SQL:

alter table teams_users_challenges 
add constraint oneUserPerTeamPerChallenge 
unique (
    user_id 
, team_id 
, challenge_id 
); 

如果你不能改變在表中,您需要按用戶和團隊進行分組,並從查詢結果中的每個組中挑選一個挑戰。也許選擇最新的挑戰。

+0

這很完美!我所要做的只是'GROUP BY tuc.user_id,tuc.team_id',並且確保我選擇了'DISTINCT tuc.user_id',並且刪除了重複項。謝謝! – TerranRich

1

我無法測試它,但如果你不能清理數據亞瓦爾建議,嘗試:

SELECT tuc.user_id, SUM(ed.data_value)/7 as value 
FROM entry_data ed 
LEFT JOIN 
(
select tuc.user_id, tuc.challenge_id from teams_users_challenges tuc group by tuc.user_id, tuc.challenge_id 
) AS SINGLE_TEAM 
ON SINGLE_TEAM.user_id = ed.user_id AND 
    ed.entry_date BETWEEN '2013-09-16' AND '2013-09-22' 
WHERE tuc.challenge_id = ___ 
AND tuc.user_id = ___