Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 10h44   #1
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
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 :
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 :
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 :
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 !
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 13h56   #2
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h13   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
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 :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 12h49   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 10h23   #5
Invité régulier
 
Inscription : mai 2011
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 49
Points : 7
Points : 7
ben moi j'aime bien bricoler pourtant

Merci pour vos réponses, je vais tester le having
maxence64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h18   #6
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 751
Points : 751
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.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h07.


 
 
 
 
Partenaires

Hébergement Web