2011-10-13 5 views
1

Je souhaite mettre à jour plusieurs lignes en fonction d'une requête SQL SELECT.boucle pure MySQL pour mettre à jour plusieurs lignes

Je veux le faire TOUT DANS UN SHELL SQL!

Voici ma sélection:

SELECT @myid := id, @mytitle := title 
FROM event 
WHERE pid>0 GROUP BY title 
ORDER BY start; 

Ensuite, je veux faire une mise à jour avec ce pseudo-code:

foreach($mytitle as $t) 
BEGIN 
    UPDATE event 
    SET pid=$myid 
    WHERE title=$t; 
END 

Mais je ne sais pas comment Ake une boucle dans SQL.

Peut-être qu'il y a un moyen de le faire dans une seule requête sql?

JE NE VEUX PAS DE PHP! SEULEMENT CODE SHELL SQL !!!

+0

Je ne pense pas que vous compreniez très bien comment SQL fonctionne. Il n'est pas clair à partir de votre question quel changement vous essayez de faire à votre base de données. Pourriez-vous s'il vous plaît expliquer en anglais quels changements vous voulez obtenir de cette "boucle SQL"? De cette façon, les gens seront en mesure d'expliquer ce que vous devez faire pour effectuer ces changements. – Hammerite

+0

Cela fait un certain temps que j'ai utilisé MySQL, mais votre requête select aura une erreur dans la plupart des dialectes SQL. id n'est ni une fonction agrégée ni n'est inclus dans le groupe par. Qu'essayez-vous de faire? Attendez-vous seulement un identifiant pour un titre donné? Si vous essayez de choisir l'un des id associés à un titre, lequel? – Jay

+0

J'ai un bug avec mes pids. Donc, je veux mettre à jour toutes les lignes avec un pid avec l'identifiant de la première occurrence d'un événement. Start est un horodateur – Marm

Répondre

3

I want to update every rows with a pid with the id of the first occurence of an event. Start is a timestamp

Je pense que cela devrait faire ce que vous voulez, mais si elle ne le fait pas (je ne suis pas sûr de se joindre à une sous-requête dans une requête UPDATE), vous pouvez utiliser une table temporaire à la place.

UPDATE 
    event 
    JOIN (
     SELECT 
      MIN(pid) AS minPID, 
      title 
     FROM 
      event 
     WHERE 
      pid > 0 
     GROUP BY 
      title 
    ) AS findPIDsQuery ON event.title = findPIDsQuery.title 
SET 
    event.pid = findPIDsQuery.minPID 
+0

SQL Server autorise les jointures dans une instruction UPDATE. Je suis assez sûr que ce n'est pas SQL conforme à l'ISO, cependant. C'est, cependant, une caractéristique très utile. Vous pouvez obtenir le même effet avec des sous-requêtes corrélées (voir ma réponse ci-dessus). –

+0

cela ne fonctionne pas, colonne Unknown 'findPIDsQuery.title' dans 'sur la clause' – Marm

+0

Je suis désolé, cela fonctionne, j'ai oublié le champ de titre dans la requête SELECT ... – Marm

0

SQL pur ne pas vraiment « boucles », en soi: il est un langage descriptif basé sur un ensemble. Je crois que la mise à jour suivante fera ce que vous voulez (bien que vos instructions de problème laisse beaucoup à désirer — nous ne savons rien au sujet du schéma sous-jacent).

update event t 
set pid = (select min(id) 
      from event x 
      where x.title = t.title 
       and x.pid > 0 
      group by x.title 
      having count(*) > 1 
     ) 

Cheers!

+0

Cela ne fonctionne pas, Vous pouvez ' t spécifier la table cible 't' pour la mise à jour dans la clause FROM – Marm

+0

Vous pouvez essayer de consulter le manuel mySql (http://dev.mysql.com/doc/refman/5.0/fr/update.html). Ou supprimez l'alias de la table et qualifiez les noms de colonnes avec le nom de la table au lieu de l'alias. –

Questions connexes