Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2007, 10h02   #1
Invité régulier
 
Inscription : mai 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 40
Points : 9
Points : 9
Par défaut Problème de requête avec WHERE MAX()

Salut tout le monde !

(Pour info je vais détailler mon problème, mais si vous voulez voir directement ma question, elle se trouve tout en bas ;-)

Voilà je possède une table "maTable" contenant 3 champs :
- id (int)
- nom (varchar)
- ordre (int)

Passons les 2 premiers champs qui parlent d'eux-même, j'en viens directement au champ "ordre" qui permet de classer mes lignes dans l'ordre de mon choix, dans ma page web... Pour mettre à jour le classement d'une ligne, je fais deux requêtes MySQL :

- La première requête permet d'incrémenter toutes les lignes dont le classement actuel est plus grand ou égal au nouveau classement à appliquer sur une ligne donnée (j'espère que vous suivez ;-).
- La deuxième permet d'attribuer le nouveau classement sur ma ligne donnée...

Bref, mon problème concerne en fait ma première requête (voici mes deux requêtes, disons par exemple que je souhaite passer mon produit dont l'ID est "24", à la position n° "10") :
*********************************
UPDATE maTable
SET ordre = ordre + 1
WHERE ordre >= 10 (*)
AND ordre < MAX(ordre) <-- c'est là où ça coince :-S
*********************************
(*) Le chiffre "10" indique donc dans ce cas que je souhaite classer ma nouvelle ligne à la 10è position, on est d'accord ;-).
DEUXIÈME REQUÊTE :
*********************************
UPDATE maTable
SET ordre = '10'
WHERE id = 24
*********************************

Voilà, revenons donc à ma première requête, et particulièrement à cette ligne, qui est la fautive :
--> AND ordre < MAX(ordre)

En gros ma première requête demande à incrémenter toutes les lignes de ma table dont l'ordre est >= 10, "SAUF la ligne dont le champ ORDRE a la valeur la plus grande" (AND ordre < MAX(ordre)). Je pensais que "ordre < MAX(ordre)" pourrait répondre à ma demande mais quand je mets cette ligne, il ne se passe rien...

Donc ma question principale est (ENFIN !! :-) :
"Comment incrémenter le champ "ordre" de toutes les lignes de ma table >= à un chiffre donné, SAUF la ligne où le champ "ordre" a la plus grande valeur ? Y a-t-il une autre requête possible ?

Merci pour vos réponses, et @ bientôt.
Tonton
seb92500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h48   #2
Membre Expert
 
Avatar de Adjanakis
 
Inscription : avril 2004
Messages : 734
Détails du profil
Informations personnelles :
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : avril 2004
Messages : 734
Points : 1 281
Points : 1 281
Bonjour,

euh... J'ai rien lu ! J'ai juste vu un MAX(*) dans une clause WHERE et ça... ça ne marche pas ! Il faut mettre les conditions utilisant les fonctions d'agrégation (MAX(), COUNT(), MIN()...) dans une clause HAVING.
__________________
Pensez au tag
Adjanakis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h59   #3
Invité régulier
 
Inscription : mai 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 40
Points : 9
Points : 9
Citation:
Envoyé par Adjanakis
Bonjour,

euh... J'ai rien lu ! J'ai juste vu un MAX(*) dans une clause WHERE et ça... ça ne marche pas ! Il faut mettre les conditions utilisant les fonctions d'agrégation (MAX(), COUNT(), MIN()...) dans une clause HAVING.
Merci pour ta réponse. Bon au moins je sais maintenant que MAX() n'a rien à faire dans une clause WHERE, dommage ! Concernant l'utilisation avec le HAVING, je ne vois pas comment je pourrais la mettre, d'autant plus qu'elle doit être utilisée avec GROUP BY... Pourrais-tu, si cela ne te dérange pas, me proposer ta requête en entier ?

Merci d'avance. ;-)
seb92500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 12h06   #4
Membre Expert
 
Avatar de Adjanakis
 
Inscription : avril 2004
Messages : 734
Détails du profil
Informations personnelles :
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : avril 2004
Messages : 734
Points : 1 281
Points : 1 281
Tu peux toujours tenter ceci :

Citation:
UPDATE maTable m, maTable n
SET m.ordre=n.ordre
WHERE m.ordre >= 10 AND m.ordre = n.ordre-1;
En espérant bien sur qu'il n'y ait pas d'index UNIQUE sur l'ordre
__________________
Pensez au tag
Adjanakis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 12h27   #5
Invité régulier
 
Inscription : mai 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 40
Points : 9
Points : 9
IMPECCABLE !!
Ca fonctionne à merveille, et ta requête, qui paraît un peu tordue aux premiers abords, est plutôt bien foutue en réalité.
Heureusement que les pro comme toi existent

Bon j'arrête ma lèche, et encore merci !

Seb
seb92500 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h37.


 
 
 
 
Partenaires

Hébergement Web