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 :

Comment faire comprendre à un ORDER BY que -7 c'est plus petit que -2 [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut Comment faire comprendre à un ORDER BY que -7 c'est plus petit que -2
    Bonjour, dans mon classement de foot, il y a tout qui fonctionne comme je veux sauf le 2e critères de tri, à savoir la différence de buts.

    Par exemple dans mes essais j'ai ça

    N Clubs P J G N P Pr Ctre diff
    17 Toulouse 0 2 0 0 2 2 8 -6
    18 Lorient 0 2 0 0 2 3 7 -4

    Or Toulouse devrait être derrière Lorient, car -6<-4.

    Bon pour les différences positives, forcément ça marche impeccablement.

    Dans ma requête sql, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql="SELECT * FROM $stats.ligue1 ORDER BY points DESC, diff DESC, pour DESC, equipe ASC ";
    Mon type de données pour diff (seul champ à pouvoir être négatif ou positif), est int(11). Certes int je pensais que c'était entier et pas relatifs, mais apparemment les nombres négatifs s'affichent bien aussi donc..

  2. #2
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Bon ben j'ai contourné le problème, en créant un autre champ.

    j'ai utilisé la 2e solution sur cette page :

    http://forum.webrankinfo.com/mysql-t...fs-t87722.html

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Re

    Mon type de données pour diff (seul champ à pouvoir être négatif ou positif), est int(11). Certes int je pensais que c'était entier et pas relatifs, mais
    Et bien la doc pour le type INT
    -> http://dev.mysql.com/doc/refman/5.0/...ric-types.html
    l'intervalle de validité d'une colonne d'entiers INT va de -2147483648 à 2147483647
    Ce qui fait que pour certains de tes champ, un TINYINT ou un SMALLINT pourrait très faire affaire, et économiser de la mémoire surtout.


    Pour ce qui est du tri, et bien il faudrait ASC (ascendant) plutôt que DESC (descendant) pour le champ diff.
    Normal, car ASC commencera par le plus petit au plus grand, donc -6 puis -4.

    Aussi, peut être faudrait il inverser certains champ dans le ORDER BY, comme faire d'abord le tri sur le diff et après les points :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY diff DESC, points ASC, pour DESC, equipe ASC
    Les tri se font dans l'ordre indiqué : (dans cet exemple)
    En 1er diff ascendant, ensuite points ascendant, pour descendant et equipe ascendant.

  4. #4
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci RuneCodePhp pour ces éléments,

    mais les points doivent être le premier critères de tri.

    Pour le tri négatif, je n'ai mis que deux enregistrements qui illustraient le problème initial, mais la différence n'est pas toujours négative, sur l'ensemble du classement :

    Donc il faudrait que je trie en DESC toutes les différences au dessus de 0, et en ASC celles qui sont en dessous.

    Ceci me compliquant trop la tâche, j'ai pris une deuxième colonne diff2, dans laquelle je mets le nombre 100 et à laquelle je rajoute la diff. Si diff est de -2, diff2 sera de 98, et je trie en fonction de diff2. Par contre j'affiche diff.

    C'est pas toujours très clair avec les noms de variables que je prends mais bon.

    sinon j'ai vu qu'il y avait un truc avec le unsigned, mais moi j'ai pas signé et pas signé, j'ai que unsigned, unsigned zerofill, binary et un autre truc.

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je vois un peu mieux, et la cause de ton problème.
    J'ai jamais eu à gérer de genre de cas, alors du coup, j'en sais rien.

    Je trouve juste dommage qu'il faille jusqu'à créer un nouveau pour ça.
    C'est de la redondance de données, et théoriquement c'est le genre de truc à éviter.
    Mais comme j'ai pas d'idée qui me vient, j'ai rien à te proposer.


    Pour le unsigned, c'est pour définir si le champ de type numérique accepte ou pas de signes négatif.
    Si tu as des champs qui ne doivent pas en avoir (genre résultat de match, clés, etc ...), alors faut spécifier unsigned.
    D'ailleurs, le fait de spécifier unsigned aura pour effet de doubler la capacité du champ (petit truc que j'ai appris il y peu, ça peu être utile).

  6. #6
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    C'est vrai que ça ne me plaisait pas non plus d'avoir à créer une autre colonne exprès, mais bon du moment que ça règle le problème je ne vais pas faire la fine bouche.

    Pour le signed/unsigned je l'ai appris aujourd'hui ben en cherchant pour ce problème, que comme le int est codé sur 4 octets, si on prend signed ça va allouer 2^32 bits allant donc de 0 à 4 294 967 296.

    Si on prend unsigned, ça va diviser par 2 pour les positifs car ça fait moitié-moitié pour les négatifs et positifs, donc ça alloue 2^31 bits allant de -2 147 483 648 à 0 pour les négatifs et de 0 à 2 147 483 648 pour les positifs.

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Il me semble avoir mieux compris ton problème.

    Théoriquement, il ne faudrait pas enregistrer la différence qu'il y a entre les rencontres, mais un calcul qui se ferait dans la requête (donc à la volée).

    En procédant ainsi, (et théoriquement), plus besoin de ce champ, et du 2ème aussi, qui permettra de faire le trie que tu veux.
    D'ailleurs, ces résultats sont de la redondances, genre de truc qu'il vaut mieux éviter.
    En règle général, on effectue ce genre de chose dans un but d'optimiser une BDD (ou une table), ça se fait particulièrement pour des statistiques.

    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT clubs, points, pour, contre, (pour - contre) AS difference, ((pour - contre) + 100) AS diff_trie
    FROM $stats.ligue1
    ORDER BY points DESC, diff_trie ASC, pour DESC, equipe ASC
    Ici, l'alias "diff_trie" est juste là pour faire le tri (ASC ou DESC je ne sais plus)
    L'alias "difference" devient l'équivalent du champ actuel diff, que tu peux exploiter dans l'affichage.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/03/2014, 10h01
  2. Réponses: 0
    Dernier message: 03/02/2010, 16h36
  3. Réponses: 2
    Dernier message: 06/04/2007, 13h31
  4. case tableau: comment faire des hauteurs plus petites que 23px
    Par cortex024 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 28/11/2006, 17h01
  5. Réponses: 1
    Dernier message: 27/08/2006, 15h16

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