2 votes

mysql joint deux requêtes très complexes

J'ai actuellement deux requêtes très complexes que j'utilise pour obtenir des résultats avec des classements. La première concerne tous les participants et leurs scores avec les rangs d'étape, la seconde est groupée par chaque participant et calcule leur rang global (somme des rangs d'étape).

Première requête pour obtenir tous les participants à chaque étape avec les scores et les rangs

SELECT * FROM (
  SELECT alias, catabbr, sh_dq, raw, sdq, dnf, 
@rownum := IF(@stage != stage_name, 1, @rownum + 1) AS rowNum,
@rank := IF(@prevVal != cTime, @rownum, @rank) AS rank,
@stage := stage_name as stage_name,
@prevVal := cTime AS cTime,
id, zeroTime
  FROM 
(SELECT @rownum:= 0) rn,
(SELECT @rank:= 1) av,
(SELECT @stage:= '') sv,
(SELECT @prevVal:= 0) pv,
(SELECT s.stage_name stage_name, sc.alias alias, sc.catAbbr catabbr, sc.sh_dq sh_dq, sc.time raw, sc.id id, sc.sdq sdq, sc.dnf dnf, 
    IF(sc.time = "0", 1, 0) AS zeroTime,
    ((ROUND(sc.time, 2) + (sc.miss * 5)) + ((sc.proc * 10) + (sc.saf * 10) + (sc.sog * 30)) - (sc.bthPoints)) cTime
    FROM matches m
    LEFT JOIN stages s ON s.match_id = m.id
    LEFT JOIN scores sc ON sc.stage_id = s.id
    WHERE m.matchuuid = 'E13A4C61-A2B8-48E2-BE1B-1FFB77CC5849'
    GROUP BY sc.alias, s.stage_name
    ORDER BY s.stage_name, zeroTime, cTime
) tv
) t
ORDER BY zeroTime, alias, stage_name;

Sorties :

+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+
| alias     | catabbr | sh_dq | raw             | sdq | dnf | rowNum | rank | stage_name            | cTime | zeroTime |
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+
| Back Bob  | S       | 0     | 52.9799995422   | 0   | 1   | 54     | 54   | Stage 1               | 92.98 | 0        |
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+
| Back Bob  | S       | 0     | 43.9099998474   | 0   | 0   | 46     | 46   | Stage 2               | 48.91 | 0        |
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+
| Ben Scal  | ES      | 0     | 26.9699993134   | 0   | 0   | 27     | 27   | Stage 1               | 31.97 | 0        |
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+
| Ben Scal  | ES      | 0     | 32.8800010681   | 0   | 0   | 38     | 38   | Stage 2               | 42.88 | 0        |
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+

La deuxième requête regroupe les participants par nom et additionne leurs rangs pour obtenir un classement final.

SELECT alias, catabbr, SUM(cTime) fTime, SUM(rank) fRank, zeroTime, rank
FROM (
  SELECT alias, catabbr, sh_dq, raw, sdq, dnf, 
@rownum := IF(@stage != stage_name, 1, @rownum + 1) AS rowNum,
@rank := IF(@prevVal != cTime, @rownum, @rank) AS rank,
@stage := stage_name as stage_name,
@prevVal := cTime AS cTime,
id, zeroTime
  FROM 
(SELECT @rownum:= 0) rn,
(SELECT @rank:= 1) av,
(SELECT @stage:= '') sv,
(SELECT @prevVal:= 0) pv,
(SELECT s.stage_name stage_name, sc.alias alias, sc.catAbbr catabbr, sc.sh_dq sh_dq, sc.time raw, sc.id id, sc.sdq sdq, sc.dnf dnf, 
    IF(sc.time = "0", 1, 0) AS zeroTime,
    ((ROUND(sc.time, 2) + (sc.miss * 5)) + ((sc.proc * 10) + (sc.saf * 10) + (sc.sog * 30)) - (sc.bthPoints)) cTime
    FROM matches m
    LEFT JOIN stages s ON s.match_id = m.id
    LEFT JOIN scores sc ON sc.stage_id = s.id
    WHERE m.matchuuid = 'E13A4C61-A2B8-48E2-BE1B-1FFB77CC5849'
    GROUP BY sc.alias, s.stage_name
    ORDER BY s.stage_name, zeroTime, cTime
) tv
) t
GROUP BY alias
ORDER BY zeroTime, fRank, fTime;

Sorties :

+-----------+-----------+-----------+-------+-----------+
| alias     | catabbr   | fTime     | fRank | zeroTime  |
+-----------+-----------+-----------+-------+-----------+
| Back Bob  | S         | 141.89    | 100   | 0         |
+-----------+-----------+-----------+-------+-----------+
| Ben Scal  | ES        | 74.85     | 68    | 0         |
+-----------+-----------+-----------+-------+-----------+

La colonne zeroTime me permet de trier les temps supérieurs à 0 et de calculer correctement le rang.

Lorsque j'essaie de les joindre, je n'obtiens aucun résultat. Existe-t-il un moyen de combiner ces deux requêtes en une seule afin d'obtenir le résultat suivant ?

+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+
| alias     | catabbr   | fTime     | fRank | zeroTime  | Stage 1 Time  | Stage 1 Rank  | Stage 2 Time  | Stage 2 Rank  |
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+
| Ben Scal  | ES        | 74.85     | 68    | 0         | 31.97         | 27            | 42.88         | 38            |
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+
| Back Bob  | S         | 141.89    | 100   | 0         | 92.98         | 54            | 48.91         | 46            |
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+

Ces données seront insérées dans une page php, ce qui me permettra de les traiter en boucle et d'en extraire ce dont j'ai besoin, mais la principale chose que j'essaie de faire est de joindre ces deux requêtes.

Mes structures et mes données sont trop volumineuses pour une sqlfiddle. Voici la structure et les insertions pour les matchs et les étapes : http://pastebin.com/YvZevd5j Voici la structure et les encarts pour les partitions : http://pastebin.com/jLBYxMvc

Il convient également de noter qu'un jeu peut comporter une ou plusieurs étapes et un ou plusieurs participants.

0voto

invertedSpear Points 6854

Cette réponse n'est peut-être pas adaptée car vous devez connaître le nombre d'étapes, mais vous pouvez peut-être la construire avec une boucle ou quelque chose du genre dans votre application. Voici une version simplifiée, que vous pouvez modifier pour l'adapter à vos données.

SELECT 
  alias,
  catAbbr,
  sum(fTime) as fTime,
  sum(fRank) as fRank,
  sum(zeroTime) as zeroTime,
  sum(Stage_1_Time) as stage_1_Time,
  sum(Stage_1_Rank) as Stage_1_Rank,
  sum(Stage_2_Time) as stage_2_Time,
  sum(Stage_2_Rank) as Stage_2_Rank
FROM (
  SELECT 
    alias,
    catAbbr,
    0 as fTime,
    0 as fRank,
    0 as zeroTime,
    Stage_1_Time as stage_1_Time,
    Stage_1_Rank as Stage_1_Rank,
    0 as stage_2_Time,
    0 as Stage_2_Rank
  FROM (query that gets stage 1 info)
  UNION
  SELECT
    alias,
    catAbbr,
    0 as fTime,
    0 as fRank,
    0 as zeroTime,
    0 as stage_1_Time,
    0 as Stage_1_Rank,
    stage_2_Time as stage_2_Time,
    Stage_2_Rank as Stage_2_Rank
  FROM (query that gets stage 2 info)
  UNION
  SELECT
    alias,
    catAbbr,
    fTime as fTime,
    fRank as fRank,
    zeroTime as zeroTime,
    0 as stage_1_Time,
    0 as Stage_1_Rank,
    0 as stage_2_Time,
    0 as Stage_2_Rank
  FROM (query that gets averaged info)
) temp
GROUP BY alias, catAbbt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X