1

したがって、ユーザー、ユーザーが参加できるチーム、チームが参加するチャレンジ ( teams_users_challenges) を接続するハッシュ/リレーショナル テーブルと、特定のチャレンジですべてのユーザーの入力データを格納するテーブル ( entry_data) があるとします。チャレンジの各ユーザーの平均スコア (特定の週の 1 日あたりの平均値) を取得したいと考えています。ただし、ユーザーが何らかの形で誤って複数のチームに参加する可能性があります (これは起こるべきではありませんが、時折起こります)。以下は、特定のユーザーのスコアを取得する 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 つの異なるチームに所属している場合、 に 3 つのエントリがあり、が 1 つだけでなくすべてのレコードを自動的に取り込むため、teams_users_challenges平均valueが 3倍になります。LEFT JOIN

を使用してみましGROUP BYたが、データを 内の 1 つのインスタンスのみに制限しているようには見えませんteams_users_challenges。内の1つのレコードのみを取得するようにクエリを制限する方法について、誰かアイデアはありますteams_users_challengesか?

補遺:内の列teams_users_challengesteam_id、、、user_idおよびchallenge_idです。

4

2 に答える 2

1

私はそれをテストすることはできませんが、Yawar が提案したようにデータをクリーンアップできない場合は、次を試してください。

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 = ___
于 2013-09-27T17:05:30.200 に答える