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

Requêtes MySQL Discussion :

Problème de requete (MySQL 4.1.9 => 3.23.39.01)


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut Problème de requete (MySQL 4.1.9 => 3.23.39.01)
    Bonjour,

    J'ai développé une application PHP/MySQL grâce à EasyPHP.
    La version de MySQL est la 4.1.9.
    Cependant l'environnement cible de cette appli est MySQL 3.23.39.01 et ne changera pas.

    Ceci me pose un petit problème dont je n'arrive pas à déterminer l'origine. La version 3.23.39.01 me retourne une erreur sur une requete qui marche parfaitement sur la 4.1.9.

    Voici la requête, et l'erreur qui en résulte:

    SELECT d.dealid, d.vermaj, MAX( d.vermin ) AS vermin
    FROM dealversion AS d, (
    SELECT dealid, MAX( vermaj ) AS vermaj
    FROM dealversion
    GROUP BY dealid
    ) AS t
    WHERE d.dealid = t.dealid
    AND d.vermaj = t.vermaj
    GROUP BY d.dealid

    #1064 - You have an error in your SQL syntax near '( SELECT dealid, MAX(vermaj) AS vermaj FROM dealversion GROUP BY dealid ) AS t W' at line 1

    Si qqun sait pourquoi et surtout comment régler le problème, qu'il n'hésite pas
    Je n'arrive pas à solutionner le problème.

  2. #2
    Membre régulier Avatar de 12_darte_12
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Février 2005
    Messages : 212
    Points : 107
    Points
    107
    Par défaut
    On dirai mon serveur dedié ovh. J'ai eu le même problème et du coup j'ai mise a jour MySql sans aucune perte de donnée et puis il y a un peu plus de fonctionnalité avec une version 4 de mysql.

    tu n'as pas des propriétés de tables qui aurait changé sur ton serveur du style une table innoDB qui est passé en MyIsam. C'est le problème que j'ai eu moi.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Points : 93
    Points
    93
    Par défaut
    .

    Si je ne dis pas de bétise, mysql ne supporte pas un select dans un autre...

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bonjour,

    Merci de consulter la avant de poster

    http://mysql.developpez.com/faq/?pag...erreur_syntaxe

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Ok pour l'origine du problème. Merci.

    Mais concernant la solution ?
    Sachant que je ne peux pas upgrade MySQL sur le serveur cible...

    Comment puis-je reformuler cette requete pour la rendre syntaxiquement acceptable par la 3.23.39.01 ?

    L'objectif est d'obtenir la dernière version de chaque 'deal'.
    dealid = identifiant du deal
    vermaj = version majeure (X dans X.Y)
    vermin = version mineure (Y dans X.Y)

    Table dealversion :
    dealid , vermaj , vermin
    1 , 1 , 0
    1 , 2 , 0
    1 , 2 , 2
    2 , 1 , 0
    2 , 2 , 0

    Résultat attendu :
    dealid , vermaj , vermin
    1 , 2 , 2
    2 , 2 , 0

    J'avais déjà galéré pour trouver la requête fonctionnant sur la version 4.1.9 mais là.... je trouve pas
    Please help

    PS: sans table temporaire

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select dealid, max(vermaj), max(vermin) from dealversion
    group by dealid
    Le GROUP BY est fait pour ça

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Et bien le problème, c'est que le group by ne selectionne pas la dernière version (comprendre: la plus haute version) du deal.

    Si dans ma base j'ai un deal avec l'id 1 qui comporte les versions 1.0, 2.5, 2.7, je veux que le résultat de la requête soit la version 2.7, soit : id 1, vermaj 2, vermin 7
    Et ça pour chaque id

    Je sais pas si tu vois ce que je veux dire

  8. #8
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Je vois tout à fait mais tu as essayé ma requête ? Quel est le résultat ?


    Edit : OK, je vois le problème. Si tu as les versions 1.3 et 2.2 ça va te sortir 2.3 comme version max.

    En fait ta table n'est pas en troisième forme normale car la colonne vermin dépend directement de la colonne vermaj.

    L'idéal serait de créer une table vermin et une table vermaj. Ainsi on peut rajouter des informations sur les versions majeures et mineures et ta requête peut se faire avec une simple jointure.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    J'ai fait la même démarche que toi au départ mais le MAX ne se fait pas séquentiellement (contrairement au group by):
    ce n'est pas MAX(vermaj) puis MAX(vermin)
    mais c'est MAX(vermaj) et MAX(vermin) en simultané

    Exemple:
    id 1 , vermaj 1 , vermin 9
    id 1 , vermaj 2 , vermin 5

    Résultat attendu:
    id 1 , vermaj 2 , vermin 5

    Résultat obtenu:
    id 1 , vermaj 2 , vermin 9

    [edit]
    Mais comment lier la version à l'id du deal ? dans le cas de tables séparées ?

  10. #10
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    C'est simple : un deal a 0 à n versions majeures et une version majeure a 1 à n versions mineures. Donc ça donne :

    deal(id_deal)
    vermaj(id_vermaj, version, id_deal)
    vermin(id_vermin, version, id_vermaj)

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

Discussions similaires

  1. [MySQL] Problème syntaxe requete MySQL UPDATE
    Par flo73 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/07/2010, 07h41
  2. problème de requetes mysql
    Par samplaid dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/07/2008, 20h05
  3. Problème phpmyadmin requetes mysql
    Par AurelBUD dans le forum Debian
    Réponses: 5
    Dernier message: 18/12/2006, 08h36
  4. Réponses: 11
    Dernier message: 08/06/2006, 16h53
  5. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 10h36

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