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 :

Extraire les 50 valeurs les plus proches d'un entier


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Extraire les 50 valeurs les plus proches d'un entier
    Bonjour,
    Je réalise un petit jeu.
    Pour départager les gagnants je propose de donner une estimation du nombre de participants.
    Au point où j'en suis je ne trouve pas la solution pour récupérer les 50 réponses les plus proches du nombre total de participants.
    cela devrait ressembler à quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q=mysql_query("SELECT reponse FROM table WHERE estimation est PROCHE DE NombreParticipants LIMIT 50");
    évidemment la fonction PROCHE DE n'existe pas et c'est bien ce qui me chagrine.
    Auriez-vous une piste sur laquelle me lancer?
    Je n'ai pas trouvé de solution en effectuant plusieurs recherches sur le forum.
    D.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Il suffit de faire la valeur absolue de la différence entre le réel et l'estimation :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT reponse 
    FROM table 
    ORDER BY ABS(NombreParticipants - estimation)  
    LIMIT 50 ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Merci de ta réponse mais j'ai dû mal m'expliquer, cela renvoie des données qui ne correspondent pas à ce que je recherche.

    Je pensais un quelque chose comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM table 
    WHERE estimation  LIKE NombreParticipants
    LIMIT 50 ;
    Ce qui ne fonctionne pas non plus mais je ne sais pas si on peut utiliser le comparateur LIKE pour des entiers

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Points : 216
    Points
    216
    Par défaut
    la réponse était donnée, il suffisait de l'adapter
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT reponse 
    FROM table 
    ORDER BY ABS(NombreParticipants - reponse) ASC
    LIMIT 50 ;


    edit : je m'explique

    on SELECTionne les reponses dans la table
    et on les classes en fonction de la valeur ABSolue de (NombreParticipants - reponse)
    et on classe en ordre croissant ASC
    ce qui classera les résultats en fonction de la plus petite différence
    et donc logiquement donnera les reponses les plus proches de NombreParticipants


    edit : j'ai édité mon erreur suite au message , moi des fois réfléchir à l'envers
    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.


    Spidercochon, spidercochon, il peut marcher au plafond
    ...MM ......Voici Spidercochon. Aidez le à conquérir le monde
    E(....)~....en le reproduisant.
    ...w

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Léortien : Merci pour l'explication ! Mais avec DESC, tu prends ceux qui ont la plus grande différence ; denis.ws veut les plus proches, donc ceux qui ont la plus petite différence.

    denis.ws : LIKE n'a rien à voir, c'est une comparaison textuelle. Tu peux techniquement l'utiliser avec des entiers, mais ça ne te donnera pas ce que tu cherches (par exemple, 25 et 256 sont LIKE '2%', mais pas 30).

    comment as-tu adapté ma requête-type ? quels résultats obtiens-tu avec ma requête ? quels résultats attendais-tu ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    voici un exemple de ma table :
    Code X : 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
    24
    25
    TABLE
    +-------+---------+------------+
    | ID   | nom      | estimation |
    +-------+---------+------------+
    | 12   | bob      |      5     |
    +-------+---------+------------+
    | 15   | bill     |      3     |
    +-------+---------+------------+
    | 16   | steve    |      6     |
    +-------+---------+------------+
    | 17   | frank    |      8     |
    +-------+---------+------------+
    | 18   | alice    |      15    |
    +-------+---------+------------+
    | 19   | jean     |      12    |
    +-------+---------+------------+
    | 20   | paul     |      16    |
    +-------+---------+------------+
    | 21   | eric     |      9     |
    +-------+---------+------------+
    | 22   | fred     |      58    |
    +-------+---------+------------+
    | 23   | Jacques  |      14    |
    +-------+---------+------------+
    Je souhaite extraire les 5 noms qui donnent la valeur 'estimation' la plus proche du nombre total de candidats ici :10

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Points : 216
    Points
    216
    Par défaut
    allez hop je prends mon courage à deux mains, j'ouvre easyphp je créé la table et je teste la requete sql

    si ta table s'apelle table
    avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT `nom` , `estimation`
    FROM `table`
    ORDER BY ABS( 10 - `estimation` ) ASC
    LIMIT 5

    tu obtiens bien :

    nom estimation
    eric 9
    jean 12
    frank 8
    Jacques 14
    steve 6

    je ne vois pas où est le problème pour appliquer ce que dit Antoun
    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.


    Spidercochon, spidercochon, il peut marcher au plafond
    ...MM ......Voici Spidercochon. Aidez le à conquérir le monde
    E(....)~....en le reproduisant.
    ...w

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    En fait oui cela fonctionne mais lors de mes premiers test les valeurs retournées me paraissaient incohérentes parce que le 0 était plus proche du nombre de participants que les estimation données par les participants.
    Je fais
    pour obtenir le nombre de participant avec un mysql_num_rows ce qui me donne une variable $nombreParticipants
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM `table`
    ORDER BY ABS( $nombreParticipants - `estimation` ) ASC
    LIMIT 50
    Puisj'ai re-testé avec $nombreParticipants = 50; // par exemple
    Et c'est beaucoup plus vraisemblable.
    Merci encore à Antoun et Léortien

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Allez, le tout en une seule requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM `table`
    ORDER BY ABS( 
      (SELECT COUNT(*) FROM `table`) - `estimation` 
    ) ASC
    LIMIT 50
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Plus élégant en effet.
    Bravo

Discussions similaires

  1. [DeskI XiR2] les 10 valeurs les plus élevées
    Par courti01 dans le forum Débuter
    Réponses: 5
    Dernier message: 21/01/2015, 11h54
  2. [XL-2003] MACRO pour rechercher les 2 valeurs les plus proches
    Par Tchibe dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/06/2010, 15h04
  3. requête pôur sélectionner les 5 valeurs les plus grandes ?
    Par kikidrome dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/11/2007, 16h29
  4. Réponses: 6
    Dernier message: 04/11/2007, 22h15

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