チャレンジでのチームのパフォーマンスをランク付けするランキング クエリがあります。
データの階層は次のとおりです。 チームにはメンバーがいます メンバーには活動があります 活動には活動タイプがあります 課題には活動タイプがあります
1 つのチャレンジですべてのチームのパフォーマンスをランク付けしたい場合は、次のクエリがうまく機能します。
SELECT t.teamID, t.teamName,
scoring.challengeID,
outerchallenge.name AS ChallengeName, outerchallenge.description AS ChallengeDescription, outerchallenge.startDate, outerchallenge.endDate,
scoring.standardValueSum, scoring.standardUnit, scoring.rank
FROM challenge outerchallenge
LEFT JOIN (
SELECT teamID, challengeID, standardValueSum, standardUnit, FIND_IN_SET(standardValueSum, scores ) AS rank
FROM (
SELECT teammember.teamID, mc.challengeID, sum(v.standardValue) standardValueSum, v.standardUnit
FROM v_activitystats v
INNER JOIN memberchallenge mc ON v.memberID = mc.memberID AND v.standardValue > 0
INNER JOIN teammember ON v.memberID = teammember.memberID
INNER JOIN challenge c ON mc.challengeID = c.challengeID
INNER JOIN challengeactivitytype cat ON c.challengeID = cat.challengeID AND cat.activityTypeID = v.activityTypeID
WHERE v.activityDate BETWEEN c.startDate AND c.endDate
AND c.challengeID = 33
GROUP BY standardUnit, challengeID, teamID
) vstats
CROSS JOIN (
SELECT GROUP_CONCAT( DISTINCT standardValueSum ORDER BY standardValueSum DESC ) AS scores
FROM (
SELECT teammember.teamID, mc.challengeID, sum(v.standardValue) standardValueSum
FROM v_activitystats v
INNER JOIN memberchallenge mc ON v.memberID = mc.memberID AND v.standardValue > 0
INNER JOIN teammember ON v.memberID = teammember.memberID
INNER JOIN challenge c ON mc.challengeID = c.challengeID
INNER JOIN challengeactivitytype cat ON c.challengeID = cat.challengeID AND cat.activityTypeID = v.activityTypeID
WHERE v.activityDate BETWEEN c.startDate AND c.endDate
AND c.challengeID = 33
GROUP BY challengeID, teamID
) vstats
) scores
) scoring
ON outerchallenge.challengeID = scoring.challengeID
INNER JOIN team t ON scoring.teamID = t.teamID
フォーマットされたクエリは次のとおりです: http://mysql.pastebin.com/XggRL5kX
ChallengeID、チーム、ランキング 99 赤チーム 1 99 青チーム 2
繰り返しますが、これは特定のチャレンジ (ID = 33) では問題なく機能します。
同じ種類のランキングでクエリを取得したいのですが、すでに終了しているような複数の課題があります。
私はこのクエリを試しました:
SELECT rankings.teamID, stuff.teamName, rankings.challengeID,
rankings.ChallengeName, rankings.ChallengeDescription, rankings.startDate, rankings.endDate,
rankings.standardValueSum, rankings.standardUnit, rankings.rank
FROM challenge chal
LEFT JOIN (
SELECT t.teamID, t.teamName, scoring.challengeID,
outerchallenge.name AS ChallengeName, outerchallenge.description AS ChallengeDescription, outerchallenge.startDate, outerchallenge.endDate,
scoring.standardValueSum, scoring.standardUnit, scoring.rank
FROM challenge outerchallenge
LEFT JOIN (
SELECT teamID, challengeID, standardValueSum, standardUnit, FIND_IN_SET(standardValueSum, scores ) AS rank
FROM (
SELECT teammember.teamID, mc.challengeID, sum(v.standardValue) standardValueSum, v.standardUnit
FROM v_activitystats v
INNER JOIN memberchallenge mc ON v.memberID = mc.memberID AND v.standardValue > 0
INNER JOIN teammember ON v.memberID = teammember.memberID
INNER JOIN challenge c ON mc.challengeID = c.challengeID
INNER JOIN challengeactivitytype cat ON c.challengeID = cat.challengeID AND cat.activityTypeID = v.activityTypeID
WHERE v.activityDate BETWEEN c.startDate AND c.endDate
GROUP BY standardUnit, challengeID, teamID ) vstats
CROSS JOIN (
SELECT GROUP_CONCAT( DISTINCT standardValueSum ORDER BY standardValueSum DESC ) AS scores
FROM (
SELECT teammember.teamID, mc.challengeID, sum(v.standardValue) standardValueSum
FROM v_activitystats v
INNER JOIN memberchallenge mc ON v.memberID = mc.memberID AND v.standardValue > 0
INNER JOIN teammember ON v.memberID = teammember.memberID
INNER JOIN challenge c ON mc.challengeID = c.challengeID
INNER JOIN challengeactivitytype cat ON c.challengeID = cat.challengeID AND cat.activityTypeID = v.activityTypeID
WHERE v.activityDate BETWEEN c.startDate AND c.endDate
GROUP BY challengeID, teamID
) vstats
) scores
) scoring ON outerchallenge.challengeID = scoring.challengeID
INNER JOIN team t ON scoring.teamID = t.teamID
) rankings ON chal.challengeID = rankings.challengeID
WHERE chal.endDate <= current_date()
フォーマットされたクエリは次のとおりです: http://mysql.pastebin.com/mSZwtDm3
ただし、すべてのチャレンジに 1 位と 2 位があるのではなく、ランキングはすべてのチャレンジにまたがっています。このような
ChallengeID、チーム、ランキング 99 レッド チーム 1 99 ブルー チーム 2 134 レッド チーム 3 134 ブルー チーム 4 443 レッド チーム 5 442 ブルー チーム 6
だから、私は間違った場所でランキングを評価していると思いますが、これを機能させる方法についてはちょっとアイデアがありません. 次のような結果を取得するにはどうすればよいですか: ChallengeID, Team, Ranking 99 Red Team 1 99 Blue Team 2 134 Red Team 1 134 Blue Team 2 443 Red Team 1 443 Blue Team 2