IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Problème de requête avec WHERE MAX()


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    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

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    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. ;-)

  4. #4
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Tu peux toujours tenter ceci :

    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

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/03/2010, 20h49
  2. [MySQL] Problème de requête avec MAX()
    Par vince351 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/11/2009, 20h59
  3. Problème dans requête avec clause MAX
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2007, 17h00
  4. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo