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

PHP & Base de données Discussion :

Ordonner des resultats par calcul [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut Ordonner des resultats par calcul
    Bonjour,

    J'aimerais faire une requête qui trie les resultats après les avoir groupés et qui les ordonne selon un calcul préalablement fait et non ordonner a partir d'une colonne d'une table.

    Voici à quoi ca ressemble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    	require '../../connect.inc.php';
      $sqluc6 = "SELECT * FROM tips INNER JOIN users ON id = uid GROUP BY uid;";
      $requc6 = mysql_query($sqluc6) or die('Erreur SQL !<br>'.$sqluc6.'<br>'.mysql_error());
     
     
     
      while ($datau6 = mysql_fetch_assoc($requc6))
      {
      $sqluc3 = 'SELECT sum(stake) FROM tips,users WHERE tips.uid = users.id AND tips.uid = "'.$datau6['id'].'" AND tips.gain > -1';
    $sqluc4 = 'SELECT sum(gain) FROM tips,users WHERE tips.uid = users.id AND tips.uid = "'.$datau6['id'].'" AND tips.gain > -1';
     
    $requc3 = mysql_query($sqluc3) or die('Erreur SQL !<br>'.$sqluc3.'<br>'.mysql_error());
    $requc4 = mysql_query($sqluc4) or die('Erreur SQL !<br>'.$sqluc4.'<br>'.mysql_error());
     
    $return2 = mysql_result($requc4,0);
    $return = round($return2, 2);
     
    $invest2 = $return / mysql_result($requc3,0) *100;
    $invest = round($invest2, 2);
     
      $sqluc7 = "SELECT * FROM tips INNER JOIN users ON id = uid WHERE uid = ".$datau6['id']." ORDER BY ".$invest." DESC";
      $requc7 = mysql_query($sqluc7) or die('Erreur SQL !<br>'.$sqluc7.'<br>'.mysql_error());
      echo ''.$datau6['nickname'].' ('.$invest.')<br />';

    Le problème est que j'arrive bien à afficher l'utilisateur, sa moyenne en pourcentage (depuis le calcul $invest). Mais je n'arrive pas à ordonner selon ce précédent calcul.

    J'ai essayé sinon de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ''.$datau6['nickname'].' ('.$invest.')<br />';
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ''.$datau7['nickname'].' ('.$invest.')<br />';
    Mais je perds le nickname, il ne veut pas s'afficher et n'ordonne pas tel que je lui ai demandé de toute manière.

    Avez-vous une idée de comment je pourrais formuler ça ?

    Bien cordialement,

    LM

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Par défaut rep
    Peux tu donner exemple plus simple ?

    Par contre conseil : évite les requêtes sql de tri à moins que tu veuilles faire tomber ton serveur. Il vaut mieux que tu travailles en tableaux multidimentionnels avec les fonctions de tri tel que SORT()...etc Le travail dans la mémoire du serveur est plus rapide que l'utilisation de la fonction sql.

    Exemple de tri alphabetique sur le nom contenu dans la colonne 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $sql=mysql_query("SELECT num,nom,prenom FROM ins");
    $i=0;
    $a=array();
    while($b=mysql_fetch_object($sql)){
                                        $a[$i][0]=$b->num;
                                        $a[$i][1]=$b->nom;
                                        $a[$i][2]=$b->prenom;
                                       $i++;
                                                                    }
    $_SESSION['a']=$a;unset($a);
    fonction de tri alphabétique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $val=$_SESSION['a'];
    function alphabetic($vala,$valb){
                        return strcmp($vala[1],$valb[1]);
                                                              }
    usort($val,'alphabetic');
    $_SESSION['a']=$val;
    Par contre pour ta demande donne nous un exemple simple .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Merci pour la précision.

    Très bien donc, je reformule.

    J'ai une table users -> id,nickname,password...
    tips -> id,uid,stake,gain,titre,descr

    que je joins de la sorte: id=uid

    De façon à connaitre la moyenne du retour sur investissement en pourcentage, je fais comme suit:
    somme des 'gain' / somme des 'stake' *100
    (somme des gains divisée par somme des stake multiplier par 100)

    Donc, j'en reviens à ce que je n'arrive pas à appliquer.
    C'est à dire, trier les resultats (ORDER) selon ce dit calcul qui est fait pour chaque utilisateur.

    J'ai utilisé le même exemple pour que le code que j'ai mis au-dessus soit toujours d'actualité.

    Merci de me donner un petit coup de pouce, je ne vois pas très bien comment faire :s

  4. #4
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    J'ai pas trop compris mais ca peut pas se regler en un requete ca?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT uid, SUM(gain/stake) as Gain FROM Tips GROUP BY uid ORDER BY Gain

    Ainsi pour chaque personne tu la somme des gains (trié)

    Il te reste à faire lorsque tu l'exploite dans un While à multiplier Gain par 100 exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While ($JeuEnr=mysql_fetch_assoc($result){
          echo  $JeuEnr['Gain']*100;
     
    }
    Enfin c'est une simple approche et si j'ai pas fait le * 100 dans la requete c'est parce que je sais pas si on peut ^^ J'espère déjà que la requete est bonne

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Merci beaucoup.

    Vous m'avez mis sur la bonne voie.

    il ne fallait pas en fait globaliser le calcul dans la requete de tel sorte :

    Le problème est résolu. Merci encore.

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

Discussions similaires

  1. répresentation des resultat par "graphe"
    Par usto2005 dans le forum Images
    Réponses: 2
    Dernier message: 12/06/2008, 12h32
  2. [MySQL] Requête ordonnant les résultats par mois
    Par DukyGeorge dans le forum Langage SQL
    Réponses: 12
    Dernier message: 15/05/2006, 19h48
  3. calcul des statistiques par dbms_stat
    Par learn dans le forum Oracle
    Réponses: 5
    Dernier message: 27/02/2006, 21h16
  4. Réponses: 5
    Dernier message: 29/12/2005, 10h31
  5. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42

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