Je demande à quiconque de m'aider à mieux titrer cette question, je ne sais pas comment l'appeler. Peut-être que quelqu'un aura une idée après avoir lu la question ci-dessous:

J'ai donc un ensemble de joueurs et leurs groupes stockés dans MySQL. Dans la base de données, pour des raisons héritées, ils sont stockés d'une manière étrange (comme une chaîne), comme indiqué ci-dessous:

Player_Id     New_Group
100           1
101           0
102           0
103           0
104           1
105           0
106           0
107           0
108           0

Donc, ici, PlayerId 100 a New_Group défini sur 1. Il est donc au début d'un nouveau groupe. Maintenant, tous les joueurs après lui puisqu'ils ont New_Group à 0, tombent dans son groupe. Quand nous arrivons à 104, un nouveau groupe démarre.

Ce que je veux faire est d'écrire une requête qui donnera un résultat comme ceci:

Player_Id     Group_Id
100           1
101           1
102           1
103           1
104           2
105           2
106           2
107           2
108           2

Vous voyez l'idée ... J'essaie de convertir la logique New_Group en quelque chose qui génère juste des pseudo-identifiants de groupe pour les joueurs.

Cependant, cela dépasse mes compétences SQL. Si un gourou SQL peut m'aider, ce serait génial. J'utilise MySQL.

0
Undefined Variable 5 mai 2017 à 18:15

3 réponses

Meilleure réponse

Comment c'est?

SET @group = 0;
SELECT Player_Id, IF(New_Group, @group:=@group + 1, @group) AS Group_Id
FROM [table]
ORDER BY Player_Id;
1
Eggsalad 5 mai 2017 à 15:53

En supposant que vous ayez une colonne dans le tableau qui est ascendante, vous pouvez faire:

select Player_Id, count(select * from [table] t2 where new_group=1 and t2.ascending_row <= t1.ascending_row) from [table] t1

Dans votre exemple ci-dessus, Player_Id pourrait être utilisé pour ascending_row car les valeurs sont toutes incrémentées. Sinon, vous devrez peut-être créer une table temporaire avec une colonne contenant l'ID de ligne, puis l'utiliser.

0
Tim B 5 mai 2017 à 16:21
SELECT player_id
     , CASE WHEN new_group = 1 THEN @i:=@i+1 ELSE @i:=@i END i 
  FROM my_table
     , (SELECT @i:=0) vars 
 ORDER 
    BY player_id;
0
Strawberry 5 mai 2017 à 15:38