Note that there are some explanatory texts on larger screens.

plurals
  1. POHow can I reduce the size of this Ranking Query in MySql?
    primarykey
    data
    text
    <p>I've got a ranking query that ranks the performance of teams in challenges.</p> <p>The hierarchy of data is as follows: teams have members members have activities activities have activitytypes challenges have activitytypes</p> <p>If I want to rank the performance all teams in a single challenge, this query works great:</p> <pre><code>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 &gt; 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 &gt; 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 </code></pre> <h2>Here is a formatted query: <a href="http://mysql.pastebin.com/XggRL5kX" rel="nofollow noreferrer">http://mysql.pastebin.com/XggRL5kX</a></h2> <p>ChallengeID, Team, Ranking 99 Red Team 1 99 Blue Team 2</p> <p>Once again, this works just fine for a specific challenge, (ID = 33)</p> <p>I want to get a query with the same sort of rankings, but for multiple challenges, like those that have already ended.</p> <p>I tried this query:</p> <pre><code>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 &gt; 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 &gt; 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 &lt;= current_date() </code></pre> <h2>Here is a formatted query: <a href="http://mysql.pastebin.com/mSZwtDm3" rel="nofollow noreferrer">http://mysql.pastebin.com/mSZwtDm3</a></h2> <p>But rather than every challenge having a 1st place, and a 2nd place, the rankings are across all of the challenges. Like this</p> <p>ChallengeID, Team, Ranking 99 Red Team 1 99 Blue Team 2 134 Red Team 3 134 Blue Team 4 443 Red Team 5 442 Blue Team 6</p> <p>So, I suppose, I'm evaluating the ranking at the wrong place, but I'm sort of out of ideas for how to make this work. How can I get results like this: 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 </p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload