したがって、ユーザー、ユーザーが参加できるチーム、チームが参加するチャレンジ ( 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_challenges
はteam_id
、、、user_id
およびchallenge_id
です。