我有一个排名查询,可以对挑战中团队的表现进行排名。
数据层次结构如下: 团队有成员 成员有活动 活动有活动类型 挑战有活动类型
如果我想在单个挑战中对所有团队的表现进行排名,这个查询效果很好:
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
ChallengeID,团队,排名 99红队1 99 Blue Team 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()
但是,不是每个挑战都有第一名和第二名,排名都是跨越所有挑战。喜欢这个
ChallengeID,团队,排名 99红队1 99蓝队2 134红队3 134蓝队4 443红队5 442 Blue Team 6
所以,我想,我正在评估错误位置的排名,但我对如何使这项工作有点想法。我怎样才能得到这样的结果: ChallengeID,团队,排名 99红队1 99蓝队2 134红队1 134蓝队2 443红队1 443蓝队2
答案 0 :(得分:0)
听起来你正在寻找的是Oracle子句“PARTITION BY”,它可以进行子组,然后允许你像你试图做的那样排名多次。
可能最简单的方法是,不是试图显示由mySQL生成的排名,而是创建自己的排名。
这是一个比我能够制定的更好的例子,嘿,这几乎是凌晨4点! http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/