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 :

requete sql max de sum/sum en gardant les autres infos


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut requete sql max de sum/sum en gardant les autres infos
    Bonjour à vous,
    j'ai un petit souci avec une requete mysql, j'ai fouillé toute la matinée sur le web mais je n'ai pas trouvé grand chose que je puisse exploiter. Je connais la syntaxe mysql, je ne suis pas vraiment un débutant, mais disons que pour les requetes compliqué, je suis parfois largué, c'est le cas pour ce qui suit... :eek:

    La première requete me permet d'afficher une liste de secteurs, nb étant le nombre d'entrées par secteur et prmoy le prix moyen par secteur. Cette requete fonctionne et m'affiche toute les infos.
    Cependant j'aimerais également obtenir le MAX(prmoy) et ça je n'y arrive pas, à part grâce à cette deuxième requete qui ne m'affiche plus du coup que le MAX(prmoy) et "m'oublie" toutes les autres infos.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT secteur,date,ROUND(SUM(prix)/SUM(surface)) as prmoy, COUNT(id) as nb FROM $tablec WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) AND logement='".$_GET['l']."' GROUP BY secteur order by prmoy";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT MAX(tout.prmoy) as maxprmoy FROM (SELECT secteur,date,ROUND(SUM(prix)/SUM(surface)) as prmoy, COUNT(id) as nb FROM $tablec WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) AND logement='".$_GET['l']."' GROUP BY secteur order by prmoy) as tout;
    donc en clair, comment faire pour "mixer" ces 2 requetes?! :confused:
    je pourrais utiliser les 2 requetes séparement, mais bonjour l'efficacité et le bricolage!

    Merci d'avance pour votre aide
    Gwena

    ps: j'ai posté le meme message sur http://mysql.ifrance.com si j'ai une réponse la bas je la mettrai ici ou vis-versa (je n'ai pas vu dans les regles du forum quelque chose empechant ce genre de pratiques )
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Je ne sais pas si ta version de MySQL le supporte, mais il est normalement possible de mettre une sous requête dans la liste d'élements après ton SELECT, donc de faire quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT colonne1, (SELECT max(colonne1) FROM table1) as 'maxCol1' from table1
    A essayer..
    K

  3. #3
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *,COUNT(id) as nb, ROUND(SUM(prix)/SUM(surface)) as prmoy2, 
    (SELECT MAX(prmoy2) FROM $tablec) AS maxprmoy FROM $tablec 
    WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) 
    GROUP BY secteur
    mais ça ne donne rien of course > Reference 'prmoy2' not supported (reference to group function)

    en fait dans le calcul du prmoy2, la clause where est indispensable et j'ai peur que dans ta requete le calcul de MAX ignore ma clause where...
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Points : 71
    Points
    71
    Par défaut
    Tu as quelle version de mysql ?

    Les requètes imbriquées sont disponible à partir de la version 4 me semble t'il.

  5. #5
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    je teste en local avec mysql 5...
    sinon pour bien que vous compreniez ce que je veux faire, la requete aurait pu ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT secteur,date,ROUND(SUM(prix)/SUM(surface)) as prmoy, COUNT(id) as nb,MAX(prmoy) 
    FROM $tablec WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) 
    GROUP BY secteur order by prmoy
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(ROUND(SUM(prix)/SUM(surface))) as maxPrixmoy
    K

  7. #7
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    il ne veut rien savoir
    Invalid use of group function
    sinon j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "SELECT COUNT(id) as nb,MAX(prmoy) as maxprmoy FROM 
    (SELECT id, ROUND(SUM(prix)/SUM(surface)) as prmoy FROM $tablec 
    WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) GROUP BY secteur) as t";
    il me renvoit bien une fois le maxprmoy et meme le count(id)
    mais il ne me renvoit aucune autre info

    je suis en train de regarder la dedans...
    http://www.developpez.net/forums/sho...66&postcount=4
    peut etre que...
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Non non pas comme ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT secteur,date,ROUND(SUM(prix)/SUM(surface)) as prmoy, COUNT(id) as nb,MAX(SUM(prix)/SUM(surface)) 
    FROM $tablec WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) 
    GROUP BY secteur order by prmoy
    K

  9. #9
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    oui oui j'ai bien essayé comme tu me l'as suggéré juste avant, mais ça me renvoyait l'erreur que j'ai marqué!

    en fait la solution c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql2 = "SELECT nb,secteur,prmoy,MAX(prmoy) as maxprmoy FROM 
    (SELECT COUNT(id) as nb,id,secteur,ROUND(SUM(prix)/SUM(surface)) as prmoy FROM $tablec 
    WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) AND logement='".$_GET['l']."' GROUP BY secteur) as t GROUP BY secteur,id order by prmoy";
    ça a l'air un peu barbare comme ça, mais ça marche, t'étais pas trés loin de la vérité
    en gros, c'était ma requete de départ, que je mets dans une autre requete qui fait le calcul Max et sur laquelle on oublie pas le GROUP BY secteur,id

    merci pour ton aide, j'aurais quand meme pas pu trouver sans
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Dans ce genre de problème, il est essentiel de tester dans le requêteur jusqu'à obtenir ce dont on a besoin

    Je ne connaissais pas ta structure de table donc il était difficile de tomber sur la bonne requête du premier coup ! Content que tu aies trouvé une solution

    A+
    K

  11. #11
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    ouais t'inquiete, je me suis rendu compte aprés coup (et en lisant d'autres posts) que je n'avais pas donné ma structure... désolé
    quoi qu'il en soit je suis content d'avoir trouvé
    bonne journée!
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  12. #12
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    en fait ça ne fonctionne pas, il me prend le maxprmoy de chaque secteur et non celui de TOUS les secteurs.
    si je fais un order DESC on voit qu'il prend la dernière valeur de maxprmoy affichée...
    count(id) --- Secteur--- Prmoy
    (11)-----------C4---------1454
    (2)------------B12--------1441
    (2)------------A9---------1389
    soit disant le max prmoy: 1389
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  13. #13
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    up?
    en fait mais si je n'inscrit pas max dans ma requete, comme elle ne fait pas vraiment ce que je lui demande, j'obtiens la valeur maximum en classant par prmoy ASC, en desc j'ai la valeur mini, mais bon j'aurais voulu que ça me trouve le max quelque soit l'order by...
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  14. #14
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    youhou!!!!
    et voila la bonne requete qui marche!
    par contre je donnerai des explications un autre jour (si il y en a besoin) parce que la je sature...
    bon et j'avoue, je ne sais pas si cette est réellement optimisée, mais sachant qu'elle ne va pas servir toutes les secondes, ce n'est pas grave!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  secteur,ROUND(SUM(prix)/SUM(surface)) as prmoy1,COUNT(id) as nb, maxprmoy
    		FROM  $tablec,
     
     
    	(SELECT MAX(prmoy) as maxprmoy
    	FROM 
    		(SELECT secteur,ROUND(SUM(prix)/SUM(surface)) as prmoy 
    		FROM $tablec 
    		WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) AND logement='".$_GET['l']."' 
    		GROUP BY secteur) as a1
    		) as a2
     
    	WHERE date_format(date, '%Y-%m-%d') > SUBDATE(CURRENT_DATE(),INTERVAL 12 MONTH) AND logement='".$_GET['l']."'
    	 group by secteur order by prmoy1 DESC
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  15. #15
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Si je puis me permettre, arrivé à ce point là ça revient un peu veaucoup à faire deux requètes.

  16. #16
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    hmmm ha?
    oui mais il faudrait que je fasse une boucle pour obtenir les premiers résultats et ensuite insérer la 2° requete dedans... ça serait un peu le bazar non?
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

  17. #17
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Ben mine de rien, "a2" est complètement décorellée, donc elle pourrait être lancée séparément en premier. C'est lisible, on récupère le max et c'est tout.

    L'insérer comme sous-requête permet d'avoir tout en une fois, c'est vrai, mais c'est artificiel et n'apporte probablement pas de gain d'efficacité. Et c'est d'une lisibilité douteuse. D'ailleurs, si le but est l'efficacité, le mieux serait peut-être de récupérer le max via le code client quand il parcourt les résultats par secteur, ça éviterait à MySQL de faire somme toute deux fois la même chose.

    M'enfin je chipotte

  18. #18
    Membre du Club Avatar de gwena54
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 57
    Points
    57
    Par défaut
    je vois mal comment je pourrais récupérer le max via un code client? qu'entends tu exactement par là?
    sinon il n'y a pas moyen d'améliorer cette requete, qui j'en convient, n'est surement pas plus efficace, pas plus lisible???
    elle est utilisée pour créer un graphique donc elle n'est pas appelée toutes les 2 secondes...
    Création de sites, référencement, immobilier et aussi un ptit' blog sur le web et les choses intéressantes du moment

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

Discussions similaires

  1. Requete SQL pour réaliser une SUM
    Par guigui69 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/03/2011, 18h31
  2. [AC-2000] Requete SQL Max
    Par b0rnt0g33k dans le forum IHM
    Réponses: 4
    Dernier message: 16/02/2011, 08h56
  3. requete SQL max
    Par trikker dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/06/2009, 23h32
  4. [MySQL] Requete SQL Max ID par magasin
    Par dam28800 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/11/2008, 11h36
  5. Requete SQL Max ID par magasin
    Par dam28800 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 28/11/2008, 11h15

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