Base de données relationnelles

Statut
N'est pas ouverte pour d'autres réponses.

Ezekiel !

Elite
Bonjour,
J'ai un problème avec ma base de donnée. Je vais essayer d'être clair mais c'est un peu dur a expliquer ^^:
J'ai une table (membre) avec un membre qui comprend:
id
login
pass
email
...
...
...
J'ai une autre table (vote) avec les votes pour ce membre qui comprend:
id_membre
id_voteur
date_vote
note
Je calcule la note du membre en sélectionnant les votes de la table vote et en divisant le tout par le nombre de vote qu'il y a eu (je fais la moyenne quoi...)

Mon probleme : je voudrai afficherles membres par odre de leur note
Pour afficher les membres par pseudo c'est facile je fait ORDER BY pseudo mais pour la note je ne vois pas vu que celle ci n'est pas dans ma bdd mais est le fruit d'un calcul que je fait.
Si quelqu'un a une technique pour contourner ce problème je lui serai tres reconnaissant.

PS: si ça peut aider le site en question est www.e-pcw.com et j'ai le meme problème pour afficher les membres par ordre de nom de team ....
 

Bingo

Beer Addict
Qu'est-ce que c'est comme base de données ?
Mettre la moyenne dans la clause ORDER BY fonctionnera avec la plupart des SGBD :

Code:
SELECT membre.*, AVG(vote.note) AS moyenne
FROM membre LEFT JOIN vote ON membre.id = vote.id_membre
GROUP BY membre.id
ORDER BY AVG(vote.note) DESC;
En MySQL, je pense que tu peux même mettre l'alias dans la clause ORDER BY (ORDER BY moyenne), mais ça ne marchera pas en Access.

<edit>ORDER BY bien-sûr, pas ORDRE BY...</edit>
 
1er
OP
Ezekiel !

Ezekiel !

Elite
ouch je connaissais pas ça :)
Merci je vais voir ce que je peux en tirer avec ça.
 
Sinon si je dis pas de bétises, tu mets tes valeurs calculées dans un tableau et tu tries le tableau
 
1er
OP
Ezekiel !

Ezekiel !

Elite
PunkDeLuxe a dit:
Sinon si je dis pas de bétises, tu mets tes valeurs calculées dans un tableau et tu tries le tableau
hmm oui je pourrai fusionner l'array de ma table sql & l'array ou g calculé les notes + le nom de la team :)
Je vais creuser de ce coté la aussi pck je galere avec l'autre truc ^^
 

Bingo

Beer Addict
Sans vouloir faire le puriste, c'est absurde de coder ce que ton serveur MySQL fait pour toi.
Ce que tu demandes, tu peux l'avoir en une seule requête SQL, déjà triée. Pourquoi irais-tu faire plusieurs tableaux, plusieurs requêtes, et des calculs de moyennes?
Si les noms de tables que tu as donnés sont justes, la requête telle qu'elle est écrite plus haut doit fonctionner. (j'ai édité le code, j'avais écris ORDRE au lieu de ORDER)
 

null

ose();
Bingo a dit:
Sans vouloir faire le puriste, c'est absurde de coder ce que ton serveur MySQL fait pour toi.
Ce que tu demandes, tu peux l'avoir en une seule requête SQL, déjà triée. Pourquoi irais-tu faire plusieurs tableaux, plusieurs requêtes, et des calculs de moyennes?
Si les noms de tables que tu as donnés sont justes, la requête telle qu'elle est écrite plus haut doit fonctionner. (j'ai édité le code, j'avais écris ORDRE au lieu de ORDER)
Oui je suis 100% d'accord avec toi...
 

titoum

OPTC:970342646
ORDER BY (moyenne) desc;

tant qu'à la calculer pourquoi la refaire ?
 

Bingo

Beer Addict
titoum a dit:
ORDER BY (moyenne) desc;
tant qu'à la calculer pourquoi la refaire ?
Bingo a dit:
En MySQL, je pense que tu peux même mettre l'alias dans la clause ORDER BY (ORDER BY moyenne), mais ça ne marchera pas en Access.
Voilà pourquoi.
C'est dingue, tout le monde part du principe que tout le monde code en PHP avec une base de données MySQL... C'est très loin d'être le cas général pourtant !!!
 
Bingo a dit:
Sans vouloir faire le puriste, c'est absurde de coder ce que ton serveur MySQL fait pour toi.
Ce que tu demandes, tu peux l'avoir en une seule requête SQL, déjà triée. Pourquoi irais-tu faire plusieurs tableaux, plusieurs requêtes, et des calculs de moyennes?
Si les noms de tables que tu as donnés sont justes, la requête telle qu'elle est écrite plus haut doit fonctionner. (j'ai édité le code, j'avais écris ORDRE au lieu de ORDER)
Il faut tout de même se poser la question des performances et se demander s'il vaut mieux que la moyenne soit calculée à chaque fois qu'on affiche des infos d'un utilisateur (que ce soit la DB ou le script qui effectue le calcul) ou bien si on calcule la moyenne à chaque fois qu'on vote pour un utilisateur et de stocket cette info.

La deuxième possibilité permet d'alléger l'affichage de la liste des utilisateurs puisque l'info est déjà calculée et il suffit de l'afficher. Par contre, cela allourdi (un tout petit peu) le moment du vote et cela duplique l'information en DB (puisque tous les votes sont stockés et la moyenne aussi).
 

Bingo

Beer Addict
ZorrObiwan a dit:
Il faut tout de même se poser la question des performances et se demander s'il vaut mieux que la moyenne soit calculée à chaque fois qu'on affiche des infos d'un utilisateur (que ce soit la DB ou le script qui effectue le calcul) ou bien si on calcule la moyenne à chaque fois qu'on vote pour un utilisateur et de stocket cette info.
Oufti, je crois que le serveur MySQL est assez mort de rire quand il s'agit de calculer une moyenne, même sur des milliers d'enregistrements ! Ce sont juste de mathématiques, et ça les serveurs, ils aiment bien ! ;)
 
1er
OP
Ezekiel !

Ezekiel !

Elite
ZorrObiwan a dit:
Bingo a dit:
Sans vouloir faire le puriste, c'est absurde de coder ce que ton serveur MySQL fait pour toi.
Ce que tu demandes, tu peux l'avoir en une seule requête SQL, déjà triée. Pourquoi irais-tu faire plusieurs tableaux, plusieurs requêtes, et des calculs de moyennes?
Si les noms de tables que tu as donnés sont justes, la requête telle qu'elle est écrite plus haut doit fonctionner. (j'ai édité le code, j'avais écris ORDRE au lieu de ORDER)
Il faut tout de même se poser la question des performances et se demander s'il vaut mieux que la moyenne soit calculée à chaque fois qu'on affiche des infos d'un utilisateur (que ce soit la DB ou le script qui effectue le calcul) ou bien si on calcule la moyenne à chaque fois qu'on vote pour un utilisateur et de stocket cette info.

La deuxième possibilité permet d'alléger l'affichage de la liste des utilisateurs puisque l'info est déjà calculée et il suffit de l'afficher. Par contre, cela allourdi (un tout petit peu) le moment du vote et cela duplique l'information en DB (puisque tous les votes sont stockés et la moyenne aussi).
je préfere garder ma méthode vu que enregistrer les votes dans une table à part me permet d'interdire le voteur de répéter son vote :)
Et oui ma bdd est mySQL et donc je vais tester tout ça merci bcp :)
 
Bingo a dit:
Oufti, je crois que le serveur MySQL est assez mort de rire quand il s'agit de calculer une moyenne, même sur des milliers d'enregistrements ! Ce sont juste de mathématiques, et ça les serveurs, ils aiment bien ! ;)
Je parlais en tout généralité. Et cela dépend de plusieurs facteurs dont nous n'avons pas connaissance de leur valeur (nbr de users, sizing de la machine, etc etc)

La méthode de "prémacher" les calculs quand tu peux le faire et stocker le résultat pour son exploitation directe est une technique utilisée dans de nombreuses applications.

Je parle pas de petits sites perso, mais des applications bancaires ou autres.

Poussé à l'extrême, fait une recherche sur le terme "data warhouse" et tu verras ce que c'est :)

Enfin, soit. Bonne chance.
 

titoum

OPTC:970342646
Ez3kieL a dit:
je préfere garder ma méthode vu que enregistrer les votes dans une table à part me permet d'interdire le voteur de répéter son vote :)
Et oui ma bdd est mySQL et donc je vais tester tout ça merci bcp :)
faut voir cmt tu as réalisé ton mrd, ca va qd même te faire un tas de donnée en plus à stocker alors qu'elles sont temporaire puisque juste utile à ton classement.

'fin bonne continuation

(ps : jamais utilisé du php juste acces mysql oracle ^^ )
 

Bingo

Beer Addict
ZorrObiwan a dit:
Je parlais en tout généralité. Et cela dépend de plusieurs facteurs dont nous n'avons pas connaissance de leur valeur (nbr de users, sizing de la machine, etc etc)
On sait qu'il s'agit de voter pour des joueurs de counter-strike, donc même sur un hébergement mutualisé le calcul à la volée fera très bien l'affaire.
 
1er
OP
Ezekiel !

Ezekiel !

Elite
J'ai un 2eme problème :cool:
Bon pour ma requete SQL qui affiche les membres suivant leur fairplay j'ai ça:
Code:
		$query = mysql_query('SELECT membre.id,
								membre.login,
								membre.id_team,
								membre.country,
								membre.firstname,
								membre.email,
								AVG(vote.note) AS moyenne,
								COUNT(vote.id) AS nombre
								FROM membre LEFT JOIN vote ON membre.id = vote.id_membre
								GROUP BY membre.id
								ORDER BY moyenne DESC,nombre DESC LIMIT '.$premier.','.$max.'') or die (mysql_error());
Ca marche niquel.
Mon 2eme problème:
faire la meme chose avec les teams en sachant que la note d'une team n'est rien d'autre que la moyenne des notes de ces membres. On m'a parlé de sous requeztes SQL sans que j'arrive à exactement comprendre ce dont il est question.
Ma table team comprend:
id
nom
...
Et membre:
id
login
...
id_team
Je bloque encore une fois mais je suis sur que vous avez la solution :p
 

Bingo

Beer Addict
Pas besoin de sous-requête ici je pense.
Tu rajoutes juste ta table team que tu LEFT JOIN avec le reste :

Code:
SELECT team.id, team.nom
                        AVG(vote.note) AS moyenne,
                        COUNT(vote.id) AS nombre
                        FROM team LEFT JOIN membre ON team.id = membre.id_team
                        LEFT JOIN vote ON membre.id = vote.id_membre
                        GROUP BY team.id
                        ORDER BY moyenne DESC,nombre DESC LIMIT x,y
 
1er
OP
Ezekiel !

Ezekiel !

Elite
Bingo a dit:
Pas besoin de sous-requête ici je pense.
Tu rajoutes juste ta table team que tu LEFT JOIN avec le reste :

Code:
SELECT team.id, team.nom
                        AVG(vote.note) AS moyenne,
                        COUNT(vote.id) AS nombre
                        FROM team LEFT JOIN membre ON team.id = membre.id_team
                        LEFT JOIN vote ON membre.id = vote.id_membre
                        GROUP BY team.id
                        ORDER BY moyenne DESC,nombre DESC LIMIT x,y
mdr je viens encore d'apprendre quelques choses :cool: je savais pas qu'on pouvait faire 2 left join
 

Bingo

Beer Addict
Oui, c'est sans limite.
En fait, je t'ai un peu induit en erreur, tu devrais remplacer tous les LEFT JOIN par des INNER JOIN.
A moins que tu veuilles que les équipes qui n'ont pas de membres soient dans le résultat final, mais je ne pense pas que ce soit intérressant.

Il vaut toujours mieux mettre des INNER JOIN que des LEFT JOIN si la requête le permet.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut