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 :

Requête avec SUM très complexe


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Par défaut Requête avec SUM très complexe
    Bonjour à tous,

    Je bloque depuis longtemps maintenant sur ma requête sql qui me donne les stats de ma régie publicitaire home-made :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM stats 
    INNER JOIN banners ON banners.id=stats.idA 
    INNER JOIN pages ON pages.id=stats.idB 
    WHERE pages.actif != '0' 
    GROUP BY pages.site 
    ORDER BY (SUM(clic) / (SUM(aff)/100)) DESC 
    LIMIT 0,9
    Cette requête m'affiche bien mes bannières par CTR (taux de clic le plus élevé).

    Dans ma table BANNERS j'ai :
    id / idA / idB / aff / clic

    idA représente une bannière
    idB représente l'id d'un page web.

    Donc dans idA j'ai plusieurs fois la même bannière bien sûr !

    Tout marche bien, oui mais voilà, j'aimerais que ma requête ne m'affiche QUE les bannières ayant été affichées AU MOINS 100 fois !

    Et ça ne marche pas.

    Cette requête, avec aff > 100, ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM stats 
    INNER JOIN banners ON banners.id=stats.idA 
    INNER JOIN pages ON pages.id=stats.idB 
    WHERE pages.actif != '0' 
    AND aff>100 
    GROUP BY pages.site 
    ORDER BY (SUM(clic) / (SUM(aff)/100)) DESC LIMIT 0,9
    Elle prend en compte la 1re ligne aff, je crois, alors que je les veux TOUTES pour une bannière donnée.

    Cette requête, avec sum(aff), m'affiche une erreur (Invalid use of group function)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM stats 
    INNER JOIN banners ON banners.id=stats.idA 
    INNER JOIN pages ON pages.id=stats.idB 
    WHERE pages.actif != '0' 
    AND SUM(aff)>100 
    GROUP BY pages.site 
    ORDER BY (SUM(clic) / (SUM(aff)/100)) DESC LIMIT 0,9
    je bloque vraiment, je ne trouve aucune solution, quelqu'un pourrait-il m'aider ? merci d'avance !

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    En premier lieu, je dirais qu'il faut que tu limites ta requête à ce que tu veux réellement récupérer. Les SELECT *, c'est pratique mais pas optimal surtout quand on commence à faire des jointures tous azimuts.

    Ensuite, ce serait plus facile de t'aider si on avait la structure des 3 tables.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Effectivement, avec le modèle des données, ce serait plus simple pour comprendre ton problème (dans quelle table se trouve la donnée aff ? Quel est le lien entre les tables? ...).

    Abandonne également l'étoile pour mettre les champs dont tu as réellement besoin, parce qu'une telle requête dans un autre SGBD que MySQL ne fonctionnerait pas (il faudrait grouper sur toutes les données incluses dans l'étoile !).

    Ta dernière requête ne fonctionne pas parce que, quand on veut mettre une condition sur une fonction d'agrégation comme la fonction SUM, il ne faut pas mettre cette condition dans la clause WHERE, mais dans une clause HAVING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ... 
    FROM stats 
    INNER JOIN banners ON banners.id=stats.idA 
    INNER JOIN pages ON pages.id=stats.idB 
    WHERE pages.actif != '0' 
    GROUP BY ...
    HAVING SUM(aff)>100 
    ORDER BY (SUM(clic) / (SUM(aff)/100)) DESC LIMIT 0,9
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Il serait peut être temps d'apprendre ce qu'est un HAVING !!!

    Votre requête "très complexe" fait partie du B A BA du SQL que l'on apprend dans la première demi heure d'un cours de débutant sur SQL..

    Sans doute avez vous besoin d'un cours...
    SQL est un vrai langage et non un bricolage !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Par défaut
    ben moi j'aime bien bricoler pourtant

    Merci pour vos réponses, je vais tester le having

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il serait peut être temps d'apprendre ce qu'est un HAVING !!!

    Votre requête "très complexe" fait partie du B A BA du SQL que l'on apprend dans la première demi heure d'un cours de débutant sur SQL..

    Sans doute avez vous besoin d'un cours...
    SQL est un vrai langage et non un bricolage !!!

    A +
    Je dirait même plus, having est la première chose qu'on apprend en SQL.
    Ensuite les index, suivi des transactions et à la fin de ces 4 minutes de cours (quand on est avec des mous du bulbe, 4 minutes sont hélas une nécessité -_-) pour les curieux maladifs on peut aborder select.

Discussions similaires

  1. Requêt avec sum ne donne pas le bon résultat§
    Par _cece dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/11/2008, 18h53
  2. Requête avec blob très lente.
    Par Alphonse87 dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/08/2008, 11h32
  3. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 13h41
  4. requête avec SUM
    Par jeanfi77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/05/2007, 18h03
  5. [SQLServer] Requête avec SUM
    Par FzF dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/05/2006, 16h19

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