2010-10-16 6 views
0

Voici un problème pour le PHP-jongleur en vous. Je veux utiliser plaine-ol 'mysql_ * fonctions de PHP.Mise à jour avec une valeur incrémentée basée sur la ligne correspondante

J'ai la table MySQL suivante:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/    | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/    | 
| 22 | 01/    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 32 | XXX    | 
| 32 | XXX    | 
+-----+-----------------+ 

Les valeurs "XXX" sont ma décision. Je souhaite modifier (UPDATE) cette table à celui-ci:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/  <-  | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/  <-  | 
| 22 | 01/  <-  | 
| 24 | 01/  <-  | 
| 24 | 02/    | 
| 24 | 03/    | 
| 24 | 04/    | 
| 32 | 01/  <-  | 
| 32 | 02/    | 
+-----+-----------------+ 

Sur chaque nouvelle valeur du champ « id » (où le « < - » est, ma décision, aussi), le « fil "La valeur du champ doit se réinitialiser à" 01/"et continuer à incrémenter jusqu'à ce qu'une nouvelle valeur de" id "soit trouvée.

J'ai essayé d'interroger avec COUNT (id) pour incrémenter d'une manière ou d'une autre. J'ai essayé de stocker dans les tableaux. J'ai aussi pensé à mysql_data_seek(). Hélas, je ne semble pas l'enlever.


J'obtenu le droit de format "fil", bien que:

$thread = $i < 10 ? "0$i" : $i; 

Donc, si elle est supérieure à 10, il ne reçoit pas un zéro. Mais c'est juste la partie amusante.


Toute aide serait appréciée.

Merci

Répondre

1
SET @oldid = 0; 
SET @counter = 0; 
UPDATE tablename 
SET thread = CONCAT(
    LPAD(
    CAST(IF(id = @oldid, 
     @counter := @counter + 1,  -- same id, increment 
     @counter := (@oldid := id)/id) -- other id, set to 1 
     AS UNSIGNED), 
    2,'0'),       -- pad with '0' 
    '/')        -- append '/' 
WHERE thread = 'XXX'     -- or enumerate the whole thing if need be 
ORDER BY id, thread; 

qui peut juste être alimenté à "ol plaine » mysql_query" (3 consécutives: nourrir les SET & UPDATE requêtes séparément, alternativement oublier SET quoi que ce soit ting, je déteste les variables non initialisées;)

+0

Je vais essayer ça. Semble trop complexe à manquer. Que voulez-vous dire par "nourrir les requêtes SET & UPDATE séparément"? – nevvermind

+0

Que vous ne pouvez pas les envoyer en une seule requête, mais en tant que 3 ('mysql_query ('SET ...'); mysql_query ('SET ...'); mysql_query ('UPDATE ...');'.Il utilise des variables définies par l'utilisateur, et la complexité principale provient de la lutte contre SQL: vous ne pouvez pas "définir" une variable sauf si elle fait partie d'une expression, donc un simple @counter: = 1, @oldid: = id est devenu un expression alambiquée avec le même résultat: '@counter: = (@oldid: = id)/id', ce qui peut entraîner un float, donc nous avons renvoyé à integer. – Wrikken

+0

Nice. Pourriez-vous s'il vous plaît expliquer ou envoyer un lien combien de temps va durer la variable mysql @counter: jusqu'à la fin de la requête, la fin du script PHP ou réinitialiser le serveur mysql? Je ne le trouve pas. –

0

Définir la clé primaire tuple (id, fil) et le fil set (mais pas l'id!) Comme AUTO_INCREMENT, puis exécuter la requête

INSERT INTO mytable (id) VALUES (24),(24),(32),(24),(32),(24) 

et fil L'attribut doit être défini de manière auto-incrémentée. Si vous insistez sur le formulaire "0n /", je suggère de créer l'attribut thread_string et de créer le déclencheur BEFORE UPDATE en fonction de l'attribut NEW.thread. Ça marche?

+0

A comme le tour de l'IA. Encore, j'ai besoin d'un moyen de modifier par lot cette table. En réalité, j'ai quelques 2300 lignes. – nevvermind

+0

2300 enregistrements est pas un problème. Je voudrais créer une autre table vide (new_table) avec la clé primaire définie comme je l'ai suggéré ci-dessus, puis exécutez "INSERT INTO new_table (id) CHOISIR l'ID FROM old_table" - et vous avez terminé. Bonne chance :-) –

Questions connexes