Base de données relationnelles

Discussion dans 'Web, design' créé par Ezekiel !, 12 Juillet 2005.

Statut de la discussion:
Fermée.
  1. Offline
    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 :p:
    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 ....
    Ezekiel !, 12 Juillet 2005
    #1
  2. Offline
    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>
    Bingo, 12 Juillet 2005
    #2
  3. Offline
    Ezekiel ! Elite
    ouch je connaissais pas ça :)
    Merci je vais voir ce que je peux en tirer avec ça.
    Ezekiel !, 12 Juillet 2005
    #3
  4. Offline
    PunkDeLuxe condom
    Sinon si je dis pas de bétises, tu mets tes valeurs calculées dans un tableau et tu tries le tableau
    PunkDeLuxe, 12 Juillet 2005
    #4
  5. Offline
    Ezekiel ! Elite
    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 :p
    Ezekiel !, 12 Juillet 2005
    #5
  6. Offline
    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)
    Bingo, 13 Juillet 2005
    #6
  7. Offline
    null ose();
    Oui je suis 100% d'accord avec toi...
    null, 13 Juillet 2005
    #7
  8. Offline
    titoum GMZ Crew optc 970.342.646
    ORDER BY (moyenne) desc;

    tant qu'à la calculer pourquoi la refaire ?
    titoum, 13 Juillet 2005
    #8
  9. Offline
    Bingo Beer Addict
    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, 13 Juillet 2005
    #9
  10. Offline
    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).
    ZorrObiwan, 13 Juillet 2005
    #10
  11. Offline
    Bingo Beer Addict
    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 ! ;)
    Bingo, 13 Juillet 2005
    #11
  12. Offline
    Ezekiel ! Elite
    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 :)
    Ezekiel !, 13 Juillet 2005
    #12
  13. Offline
    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.
    ZorrObiwan, 13 Juillet 2005
    #13
  14. Offline
    titoum GMZ Crew optc 970.342.646
    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 :p )
    titoum, 13 Juillet 2005
    #14
  15. Offline
    Bingo Beer Addict
    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.
    Bingo, 13 Juillet 2005
    #15
  16. Offline
    Ezekiel ! Elite
    Ezekiel !, 13 Juillet 2005
    #16
  17. Offline
    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
    Ezekiel !, 13 Juillet 2005
    #17
  18. Offline
    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
    Bingo, 14 Juillet 2005
    #18
  19. Offline
    Ezekiel ! Elite
    mdr je viens encore d'apprendre quelques choses :cool: je savais pas qu'on pouvait faire 2 left join
    Ezekiel !, 14 Juillet 2005
    #19
  20. Offline
    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.
    Bingo, 14 Juillet 2005
    #20
Statut de la discussion:
Fermée.