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

Langage SQL Discussion :

Trouver les X nombres les plus proche d'un nombre donné


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Trouver les X nombres les plus proche d'un nombre donné
    Bonjour a tous,

    Je cherche a faire ceci par le biais d'une requête (my)sql:

    "Trouver les X nombres les plus proche d'un nombre donné."

    Exemple ma base contiendrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nom    quantité
    test0    35
    test1    37
    test2    12
    test3    39
    test4    13
    Si je limite aux 3 plus proches et que je vous dis "18" il devrait me retourner test0=>35, test2=>12 et test4=>13... (après l'ordre à la limite je me débrouille en PHP)
    Si vous avez des idées, des pistes à suivre.. là je suis désespéré

    Merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    SGBD et version ?

    Pourquoi ne pas :
    - déterminer l'écart de chaque ligne par rapport à la valeur recherchée
    - classer les lignes suivant cet ordre
    - prendre le nombre de lignes voulu

  3. #3
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Voilà ce que je te propose sous Access :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 3 Quantite, Nom
    FROM T1
    ORDER BY ABS(18-Quantite) ASC
    PS : pour convertir cette requête en MySql, tu devras utiliser le mot-clef LIMIT.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    oki je vois le genre.. n'y a-t-il pas une solution un peut moins couteuse?
    car si il y'a 10 000 enregistrements il doit faire 10 000 calcul non?

    @Magnus : ça serait pour du web donc mysql voir postgre

    Merci de vos réponses

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par pyrou
    @Magnus : ça serait pour du web donc mysql voir postgre
    Eh bien ça ne vous empêche pas de chercher par vous-même plutôt que d'attendre une réponse toute faite

    Ex : solution sous Oracle mais qui devrait générique pour tout SGBD supportant les sous-requêtes donc pas MySQL avant la version 4.1 !
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    10g CYRIL> CREATE TABLE DVP (
      2    NOM    VARCHAR2(25),
      3    QUANTITE  NUMBER(8)
      4  );
     
    Table créée.
     
    10g CYRIL> INSERT INTO DVP VALUES ('TEST0',    35);
     
    1 ligne créée.
     
    10g CYRIL> INSERT INTO DVP VALUES ('TEST1',    37);
     
    1 ligne créée.
     
    10g CYRIL> INSERT INTO DVP VALUES ('TEST2',    12);
     
    1 ligne créée.
     
    10g CYRIL> INSERT INTO DVP VALUES ('TEST3',    39);
     
    1 ligne créée.
     
    10g CYRIL> INSERT INTO DVP VALUES ('TEST4',    13);
     
    1 ligne créée.
     
    10g CYRIL> 
    10g CYRIL> SELECT   QUANTITE, QUANTITE - 18 AS ECART
      2  FROM     DVP
      3  ORDER BY ABS(ECART);
     
      QUANTITE      ECART
    ---------- ----------
            13         -5
            12         -6
            35         17
            37         19
            39         21
     
    5 ligne(s) sélectionnée(s).
     
    10g CYRIL> 
    10g CYRIL> 
    10g CYRIL> SELECT QUANTITE
      2  FROM   DVP D1
      3  WHERE ( SELECT COUNT(*)
      4          FROM   DVP D2
      5          WHERE  D1.QUANTITE <> D2.QUANTITE
      6          AND    ABS(D2.QUANTITE - 18) < ABS(D1.QUANTITE - 18) ) < 3;
     
      QUANTITE
    ----------
            35
            12
            13
     
    3 ligne(s) sélectionnée(s).

Discussions similaires

  1. Recherche de lieux les plus proches d'un point donné
    Par Quentz dans le forum Performance Web
    Réponses: 2
    Dernier message: 25/10/2013, 16h22
  2. Trouver la liste des K plus proches voisins
    Par hoccha dans le forum SAS STAT
    Réponses: 5
    Dernier message: 11/10/2011, 10h21
  3. Plus proche d'un nombre
    Par ebaynaud dans le forum Langage
    Réponses: 9
    Dernier message: 07/10/2009, 18h21

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