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 :

Récupérer uniquement les id d'un champ pour lesquels la valeur d'un autre champ est la plus grande


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Points : 111
    Points
    111
    Par défaut Récupérer uniquement les id d'un champ pour lesquels la valeur d'un autre champ est la plus grande
    Bonjour,

    Voici une table comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id	article	sup
    1	451	12
    2	460	5
    3	460	20
    4	451	10
    5	460	8
    6	454	18

    Je n'arrive pas à construire la requête qui me permette d'obtenir les id pour lesquels sup a la valeur maximale pour chacun des "article".

    Je voudrais donc récupérer dans l'exemple ci-dessus , uniquement les id 1 , 3 et 6 .

    Merci d'avance,

    HAbroc
    www.masterquizz.fr - Ne vous posez plus de questions

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Voici la query que tu pourrais avoir :


    select t.id from test t, (select id, article, max(sup) from test group by article) vw where vw.id = t.id

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ou plutôt comme ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.id
    FROM la_table t1
    INNER JOIN
    (
    	SELECT article, MAX(sup) AS max_sup
    	FROM la_table
    	GROUP BY article
    ) t2 
    	ON t2.article = t1.article
    	AND t2.max_sup = t1.sup
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre régulier
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Points : 111
    Points
    111
    Par défaut
    Tout d'abord , merci à vous deux de vous être pencher sur le problème.

    Grâce à vous , je viens de découvrir GROUP BY

    Cependant , en réalité , mon problème est plus complexe , car je ne vous ai pas tout exposé ( pensant que la résolution de ce problème me permettrait de finaliser ma requête ) .

    Voici donc le problème dans son entièreté :

    J'ai deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Shop_offres		
     
    id	article	sup
    1	451	12
    2	460	5
    3	460	20
    4	451	10
    5	460	5
    6	454	18

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Shop_monnaies	
     
    id	prix_reserve
    451	5
    454	20
    460	18

    Je souhaite donc une requête qui me permette d'obtenir les id de shop_offres pour lesquels sup a la valeur maximale pour chacun des "article" et qui vérifie également que la valeur de prix_reserve est inférieure à la valeur max( sup) de shop_offres pour chacun des id correspondant dans shop_monnaies.

    J'avais écrit quelque chose comme ceci mais ...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT shop_offres.*, shop_monnaies.* 
    FROM shop_offres, ( SELECT shop_offres.article,max(sup) FROM shop_offres GROUP BY shop_offres.article ) AS VW 
    INNER JOIN shop_monnaies ON shop_monnaies.id = shop_offres.article 
    WHERE VW.article = shop_offres.article and shop_monnaies.client = %s and sup < shop_monnaies.prix_reserve 
    ORDER BY shop_monnaies.id DESC
    où mon %s est la variable de session : $_SESSION['MM_Username']
    www.masterquizz.fr - Ne vous posez plus de questions

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Shop_monnaie.id correspond à shop_offre.article ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre régulier
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Points : 111
    Points
    111
    Par défaut
    Tout à fait .

    Un vendeur enregistre un prix de réserve dans shop_monnaies pour un article donné ; et des acheteurs potentiels font des offres sur cet article ( enregistrements dans shop_offres).

    Je souhaite donc vérifier ici quelles sont les offres les plus élévées pour lesquelles le prix de réserve n'est pas atteint.
    www.masterquizz.fr - Ne vous posez plus de questions

  7. #7
    Membre régulier
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par MadoshiNatsu Voir le message
    Voici la query que tu pourrais avoir :


    select t.id from test t, (select id, article, max(sup) from test group by article) vw where vw.id = t.id
    Bon , j'y suis arrivé ...

    J'ai créé de nouveaux champs sur ma table shop_offres afin de ne pas avoir à faire de INNER JOIN sur shop_monnaies et grâce à GROUP BY + HAVING , je suis arrivé à cette requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t.id,t.vend,t.vendeur,t.pr,t.client,t.phta,t.compteur,t.titre,t.date_vente,t.article,t.offre,t.top,t.up,t.vendue 
    FROM shop_offres t , (select id, pr, article, max(up) from shop_offres GROUP BY article DESC HAVING max(up)<pr ) vw  
    WHERE vw.id = t.id and t.vend=%s and t.top!='0' and t.vendue=''
    fortement inspirée de la suggestion de MadoshiNatsu . Merci !

    Merci également à Cinephil...
    www.masterquizz.fr - Ne vous posez plus de questions

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai créé de nouveaux champs sur ma table shop_offres afin de ne pas avoir à faire de INNER JOIN sur shop_monnaies
    Modifier un modèle de données pour arriver à faire une requête signifie que le modèle de données n'était pas bon ou que maintenant il n'est plus bon !


    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT t.id, t.vend, t.vendeur, t.pr, t.client, t.phta, t.compteur, t.titre, t.date_vente, t.article, t.offre, t.top, t.up, t.vendue 
    FROM shop_offres t 
    INNER JOIN 
    (
    	SELECT id, pr, article, max(up) 
    	FROM shop_offres 
    	GROUP BY article
    	HAVING max(up) < pr 
    ) vw ON vw.id = t.id
    WHERE t.vend = %s 
    	AND t.top <> '0' 
    	AND t.vendue = ''
    Mais j'ai quand même de gros doutes sur la requête !

    Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.

    Reprenons le besoin exprimé et le modèle de départ...
    valeur maximale pour chacun des "article"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT article, MAX(sup) AS max_sup
    FROM Shop_offres
    GROUP BY article
    les id de shop_offres pour lesquels sup a la valeur maximale pour chacun des "article"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT o1.id, o1.article, o1.sup
    FROM Shop_offres o1
    INNER JOIN
    (
    	SELECT article, MAX(sup) AS max_sup
    	FROM Shop_offres
    	GROUP BY article
    ) t1 
    	ON t1.article = o1.article
    	AND t1.max_sup = o1.sup
    et qui vérifie également que la valeur de prix_reserve est inférieure à la valeur max( sup) de shop_offres pour chacun des id correspondant dans shop_monnaies.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT o1.id, o1.article, o1.sup
    FROM Shop_offres o1
    INNER JOIN
    (
    	SELECT o.article, MAX(o.sup) AS max_sup
    	FROM Shop_offres o
    	INNER JOIN Shop_monnaie m ON m.id = o.article
    	GROUP BY o.article
    	HAVING max_sup > m.prix_reserve
    ) t1 
    	ON t1.article = o1.article
    	AND t1.max_sup = o1.sup
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre régulier
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Points : 111
    Points
    111
    Par défaut
    Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.
    Tu as parfaitement raison... Bien vu !

    J'obtiens un id aléatoire appartenant au GROUP BY de l'article dont j'ai besoin ; et pour moi , c'était finalement suffisant pour la suite de mes opérations...

    Je vais néanmoins tester et appliquer ta méthode...
    www.masterquizz.fr - Ne vous posez plus de questions

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

Discussions similaires

  1. [MySQL] Récupérer uniquement les champs modifiés
    Par gueud dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/03/2008, 10h26
  2. créer un champs d'après la valeur d'un autre champ ?
    Par deby23 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 06/03/2008, 10h16
  3. Comment ajouter des champs a partir des valeurs d'un autre champ ?
    Par zerkz dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/05/2007, 12h05
  4. Réponses: 9
    Dernier message: 09/03/2007, 15h01
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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