2010-11-21 15 views
1

J'ai une table avec des colonnes « step_ID », « goal_ID » et « STEP_NUMBER ».Comment mettre à jour un groupe d'enregistrements avec des valeurs incrémentielles

step_ID serait la clé primaire, auto-incrémentées
groupes goal_ID les différentes étapes en objectifs spécifiques
step_number est actuellement 0 partout, nouvellement créé

Je veux mettre à jour la table afin que step_number est réglé sur 0, 1, 2, 3, etc. pour chaque groupe de "ID_objectif" similaire, trié par le ID_ID.

Dit différemment, je voudrais numéroter les étapes pour un objectif donné de 0 à autant de buts qu'il y a, dans l'ordre croissant de step_ID.

J'ai essayé l'évidence:

$query = " UPDATE steps SET step_num = step_num + 1 WHERE goal_ID='689' ORDER BY step_ID";

mais qui définit simplement toutes les lignes à 1, (. Comme prévu)

J'ai essayé également d'utiliser divers sous-requêtes, mais je suis arrivé une erreur disant que je ne pourrais pas » t met à jour une table utilisée dans la clause FROM.

Pensées?

Répondre

1
Update steps 
Set step_num = (
        Select Count(*) 
        From steps As T1 
        Where T1.goal_ID = steps.goal_ID 
         And T1.step_ID < steps.step_ID 
        ) 

EDIT

On dirait que vous exécutez dans un bogue dans MySQL en ce qui concerne Mettre à jour les requêtes contenant des sous-requêtes corrélées. Ce qui précède serait la version standardisée. Vous pouvez contourner la limitation dans MySQL comme ceci:

Update steps 
Set step_num = (
        Select Count(*) 
        From (
          Select T1.step_Id, T1.goal_Id 
          From steps As T1 
          ) As Z 
        Where Z.goal_Id = steps.goal_ID 
         And Z.step_ID < steps.step_ID 
        ) 

Une autre solution:

Update steps As T1 
    Join (
      Select T1.step_ID, Count(T2.step_ID) As step_num 
      From steps As T1 
       Left Join steps As T2 
        On T2.goal_ID = T1.goal_ID 
         And T2.step_ID < T1.step_ID 
      Group By T1.step_ID 
      ) As T3 
     On T3.step_ID = T1.step_ID 
Set step_num = T2.step_num 
+0

Je reçois toujours une erreur: "Vous ne pouvez pas spécifier les 'étapes' de la table cible pour la mise à jour dans la clause FROM"? – Symmitchry

+0

@Symmitchry - On dirait que vous avez un bogue dans MySQL. J'ai posté une solution de contournement. – Thomas

2

Essayez casser la requête en 2, et utiliser mysql user defined variables

comme

$db->query("SET @counter:=-1"); 
$db->query(UPDATE steps SET step_num = @counter:[email protected]+1 WHERE goal_ID='689' ORDER BY step_ID"); 
+0

Cela a fonctionné à merveille, merci pour la pointe. Bien que je ne sache pas comment l'étendre pour atteindre tous les objectifs (c'est-à-dire sans spécifier d'ID_objectif), j'ai simplement répété les deux requêtes dans une boucle FOR pour tous les objectifs possibles. Pas élégant mais rapide et facile pour une mise à jour unique. – Symmitchry