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 très étrange avec MAX


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Problème très étrange avec MAX
    Bonjour,

    Il m'arrive un problème très étrange avec une requête utilisant la clause MAX.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MAX(counter_offer) AS counter_offer, last_offer, date, user_id, name, username 
    FROM counter_offer 
    LEFT JOIN users ON id=user_id 
    WHERE item_id=3 
    GROUP BY user_id 
    ORDER BY MAX(counter_offer) DESC
    MySQL me retourne bien ce que j'attend à savoir la contre offre la plus élévée fait par chaque utilisateur pour un article donné, le tout trié en ordre décroissant.
    Là où ça devient très étrange c'est que la valeur retournée pour last_offer est invariablement zero.
    Les autre valeurs retournées (date, user_id etc...) sont correctes sauf last_offer.
    Cette valeur est sensée retourner soit 1 soit zéro et est définie comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TINYINT(1) UNSIGNED NOT NULL DEFAULT 0
    Quelqu'un pourrait-il m'expliquer ce mystère parce que là je vois pas ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    Vous utilisez mal le group by.

    MySql devrait retourner une erreur sur ce cas là mais ne le fait pas.

    Bref, toutes les colonnes, de la clause select, non présente dans la clause group by et non entourée d'une fonction d'agrégation (sum, max, etc) auront une valeur aléatoire.

    En effet MySql ne sais pas quelle ligne retournée et retourne la 1ere trouvée.


    Donc il faudra passer par une sous requete si vous voulez sélectionner une ligne en particulier.

  3. #3
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Merci pour votre réponse sans laquelle j'aurais certainement passé des heures à me triturer les méninges.

    Ceci dit je n'arrive pas à trouver où/comment placer une sous requête pour récupérer les valeurs de last_offer, date, name, et username.
    J'ai essayé plusieurs combinaisons mais aucune n'a marché.
    Auriez vous une suggestion ?

    Merci d'avance.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Qu'avez vous essayé ?

    Postez une requete au moins.

  5. #5
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Voici une tentative mais la valeur de last_offer reste toujours zero.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MAX(counter_offer) AS counter_offer, last_offer, date, user_id, name, username 
    FROM counter_offer 
    LEFT JOIN users ON id=user_id 
    WHERE item_id=3 AND last_offer IN (SELECT last_offer FROM counter_offer) 
    GROUP BY user_id 
    ORDER BY MAX(counter_offer) DESC

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Je pense avoir trouvé, en tous cas j'obtiens les résultats attendus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT counter_offer, last_offer, date, user_id, name, username 
    FROM counter_offer 
    LEFT JOIN users ON id=user_id 
    WHERE item_id=3 AND counter_offer IN(SELECT MAX(counter_offer) FROM counter_offer WHERE item_id=3 GROUP BY user_id) 
    ORDER BY counter_offer DESC
    Est ce que la sous requête et le group by sont bien utilisés ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/05/2012, 07h19
  2. [AC-2003] Problème très étrange avec Recordset ?
    Par [ZiP] dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/03/2010, 11h59
  3. Réponses: 5
    Dernier message: 12/07/2007, 10h07
  4. problème très étrange avec mes tableaux
    Par lelutin dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/09/2006, 14h47
  5. Problème très étrange...
    Par TitiFr dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2005, 21h37

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