8791 sujets

Développement web côté serveur, CMS

Bonjour,
j'ai plusieurs update à faire sur une même table du genre:

UPDATE maTable SET maColonne1 = x WHERE id = x;
UPDATE maTable SET maColonne2 = x WHERE id = x;
UPDATE maTable SET maColonne3 = x WHERE id = x;

etc...

J'essaie de grouper tous ces updates en une seule requête mais chaque update ayant une condition différente je ne m'en sort pas.
Je précise que je débute en sql.
Quelqu'un peut-il me dire si c'est faisable?

Merci d'avance
bonsoir,

on dit souvent qu'un dessin vaut mieux que de longs discours.. dans ton cas mettre des x partout ne rend pas les choses très claires...

pourrais tu reformuler la même question mais avec des choses concrètes ???

sinon si il s'agit chaque fois d'id bien différents tu n'as d'autre choix que de faire x requètes, après il y a peut être une logique permettant de faire une boucle ou un switch...

Tu comprend donc l'intérêt d'un exemple concret Smiley cligne

@+
Hello.

De tête (un peu rouillé du SQL)
UPDATE maTable SET maColonne1 = x, maColonne2 = y WHERE id = z

La doc de UPDATE est plutôt explicite.
La doc a écrit :
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]

Modifié par Florian_R (02 Apr 2012 - 18:31)
@ pchlj
Voici mon code sans les x:

UPDATE maTable SET actifTitre1 = 1 WHERE id = 2;
UPDATE maTable SET actifTitre2 = 1 WHERE id = 10;
UPDATE maTable SET actifTitre3 = 1 WHERE id = 15;

@ Florian_R
mon problème est que j'ai une condition différente pour chaque update et que je n'arrive pas à mettre ça en forme dans une seule requête. J'ai pourtant essayé beaucoup de choses en partant de la doc mais je ne m'en sors pas....
bah oui mais ça je te l'ai dit c'est pas possible sauf si actifTitre1 2 ou 3 peuvent avoir la même valeur, mais là aussi je suppose que non sinon tu pourrais faire ceci :

update maTable set actifTitre1=1, actifTitre2=1, actiftitre3=3 where id in (2,10,15)
pas mal Lothin Smiley cligne mais le case est surtout utile dans l'exemple pour le set là le cas est plus complexe, puisque le set et l'id sont différents à chaque fois...

j'avoue que moi je complique pas dans ces cas là je fais autant de requètes que de cas... masi c'est toujours interressant d'esayer de faire ça en une requète...masi ça va être une usine à gas Smiley lol
Bonjour,

On aimerait tous qu'un code ne tienne que sur une ligne, mais des fois, il faut se faire une raison.

Tu veux mettre à jour des colonnes distinctes, avec des valeurs distinctes en fonction de conditions distinctes.

Tu ne précises pas si tes requêtes se trouvent dans du code (php ou autre) ou si tu lances des requêtes directement depuis une interface mysql.
Modérateur
Bonjour,

surtout qu'un UPDATE, dans la plupart des cas, sera plutôt une opération d'admin et donc ponctuelle, et est du coup beaucoup moins importante à optimiser qu'un SELECT.

Si au contraire ce sont les actions des utilisateurs qui génèrent ces multiples updates, il y a un problème conceptuel qui se situe avant.
pchlj a écrit :
bah oui mais ça je te l'ai dit c'est pas possible sauf si actifTitre1 2 ou 3 peuvent avoir la même valeur, mais là aussi je suppose que non sinon tu pourrais faire ceci :

update maTable set actifTitre1=1, actifTitre2=1, actiftitre3=3 where id in (2,10,15)


Je viens de tester ce code car il se trouve que j'insère la même valeur dans les différentes colonnes (mais pas aux mêmes id). Ça ne colle pas car ça affecte toutes les colonnes pour chaque id.

@ loicbcn
les requêtes sont dans une page php qui reçoit les id à modifier d'une appli html (en ajax).

Si je comprend bien je dois me faire une raison et faire autant de requêtes que j'ai d'id à modifier!
Je ne sais pas si je vois bien comment est organisé le tout, mais si c'est du php, tu dois pouvoir t'arranger pour qu'en fonction de ce que tu reçois, les updates se "montent" dynamiquement.

Ce serait bien que tu expliques la totalité de ton cas, parce que le problème que tu soumets, tu le rencontres parce que tu t'es organisé de telle façon que ce problème survient, mais la solution se trouve sans doute en amont.
si tu as un certain nombre d'update à faire, utilise les requêtes préparées, ça sera plus rapide que d’exécuter à chaque fois un update car elle ne sera analysée et compilée qu'un seule fois
je vais rejoindre loic dans sa réflexion ... aurais tu possibilité de nous expliquer ton process...

Sinon oui pour ce genre de cas où tout est différents il faut tout faire ... différents.. donc autant de requètes que de cas, mais il y apeut être moyen d'automatiser plus, ou de ne pas faire toute une collection de requètes.. au pire n'aurais tu pas mal analysé ta base ??? une mauvaise analyse et tu te retrouves avec des cas à la c o n comme ça...
J'ai rien dit...

Quoique, ça vaudrait le coup d'essayer :

UPDATE matable SET CASE 
     id WHEN x THEN champ1 
        WHEN y THEN champ2
        ELSE champ 3 END CASE 
     = 1



edit : après test, ça passe pas, ça aurait été trop simple Smiley langue
Modifié par Lothindil (03 Apr 2012 - 15:40)
J'ai essayé aussi mais ça ne colle pas avec ce dont j'ai besoin...

Pour info je vous explique en 2 mots le process:
Pour une petite appli de création de site personnalisé j'ai une interface qui permet de personnaliser le style de la page d'accueil. Le client a un choix de typo pour différents éléments, son choix est inséré dans une table qui sert à créer un css dynamique.
Parallèlement j'ai une table typo qui contient toutes les typo proposées pour les divers éléments, chaque élément correspond à une colonne et j'insère un 1 si une typo est utilisée pour un élément, sinon le champ est à 0.
Quand le client valide sa modification de style j'update la table typo en remplaçant les 0 par des 1 aux bons endroits (et vice versa). D'ou les updates....

Bref j'ai compris qu'il fallait que je fasse autant de requêtes que d'update, je vais juste suivre le conseil de xirt en faisant des requêtes préparées....

Merci à tous pour les conseils et le temps passé sur mon problème....