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

Requêtes MySQL Discussion :

Recherche résultat immédiatement supérieur


Sujet :

Requêtes MySQL

Vue hybride

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Par défaut Recherche résultat immédiatement supérieur
    Bonjour, je cherche à retouner le résultat dont la valeur d'un champ est " immédiatement " supérieure à ma valeur recherchée...et ce dans une table pouvant contenir quelques millions d'enregistrements. Je m'explique :

    Imaginons une table contenant 2 champs ( " id ", " num" ), si ma valeur cible est " 40 " alors je dois chercher la première valeur du champ " num " et ce le plus " rapidement " possible ( vu les millions d'enregistrements possibles ) . Existe-il une méthode miracle par hasard ? De manière litérale, je souhaiterai faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RECHERCHE LA PREMIERE VALEUR IMMEDIATEMENT SUPERIEURE A 40

  2. #2
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 513
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 513
    Par défaut
    Je dirais de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num FROM maTable where num>40 LIMIT 1
    Par contre, le limite sur des millions d'enregistrement n'est pas terrible :/
    Est-ce qu'il y a des index dans ta table ?

  3. #3
    Membre chevronné Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Par défaut
    Citation Envoyé par berceker united Voir le message
    Je dirais de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num FROM maTable where num>40 LIMIT 1
    Par contre, le limite sur des millions d'enregistrement n'est pas terrible :/
    Est-ce qu'il y a des index dans ta table ?
    Une question peut-être stupide mais ne faut-il pas ajouter un order by num ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Par défaut
    Je m'excuse mais je pense que j'ai mal énoncé mon problème en fait, je le refais plus simplement :

    - Admettons la table :

    id | num
    --------
    1 | 10
    2 | 22
    3 | 23
    4 | 35
    5 | 37
    6 | 38
    7 | 45

    ( num est toujours dans l'ordre )

    Si ma valeur est 26, alors je veux que mon résultat soit : id = 3 / num = 23. le résultat dont l'id est 3 est le plus proche inférieure ( et non supérieur, je me suis trompé dans mon premier énoncé ...c'est un peu le cas inverse donc). Je suppose que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num FROM maTable WHERE num<40 LIMIT 1
    Il va me renvoyer le tuple 1 ?

  5. #5
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 513
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 513
    Par défaut
    Citation Envoyé par chipster45 Voir le message
    Je m'excuse mais je pense que j'ai mal énoncé mon problème en fait, je le refais plus simplement :

    - Admettons la table :

    id | num
    --------
    1 | 10
    2 | 22
    3 | 23
    4 | 35
    5 | 37
    6 | 38
    7 | 45

    ( num est toujours dans l'ordre )

    Si ma valeur est 26, alors je veux que mon résultat soit : id = 3 / num = 23. le résultat dont l'id est 3 est le plus proche inférieure ( et non supérieur, je me suis trompé dans mon premier énoncé ...c'est un peu le cas inverse donc). Je suppose que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num FROM maTable WHERE num<40 LIMIT 1
    Il va me renvoyer le tuple 1 ?
    Il va te retourner un resultat, dans ton cas, le plus proche.

  6. #6
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Bonjour,

    Avec la seconde explication, la solution est maintenant plus claire

    Il faudrait essayer de faire un truc dans ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT IF(val-T1.num<=IFNULL(T2.num,val)-val,T1.num,IFNULL(T2.num,val))
      FROM table T1 LEFT JOIN table T2 ON (T1.id+1=T2.id)
      WHERE (T1.num<=val OR T1.id=1) && (T2.num>=val OR T2.id IS NULL)
    Attention, il ne faut pas de trou dans les id pour que cette méthode fonctionne et il y a peut-être des cas auxquels je n'ai pas pensé.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Par défaut
    Bon et bien finalement, voilà la réponse qui marche le mieux ( en ayant créé un indx sur le champ "num" ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num FROM maTable WHERE num<40 LIMIT 1
    Merci beaucoup pour les réponses

  8. #8
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 513
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 513
    Par défaut
    Citation Envoyé par nounetmasque Voir le message
    Une question peut-être stupide mais ne faut-il pas ajouter un order by num ?
    Faire un order by num peut être problématique sur un taille aussi grande. Du moin, le resultat peut être énorme si c'est une chaine de caractère. Sur du numéric ça passe.

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

Discussions similaires

  1. Formulaire recherche + résultat sur plusieurs pages
    Par Pepito2030 dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2007, 12h23
  2. [SQL] Recherche à résultats multiples SQL - PHP
    Par Paradise01 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/08/2006, 14h52
  3. [XP pro] Suppression du résultat d'une recherche
    Par Higgins dans le forum Windows XP
    Réponses: 1
    Dernier message: 17/02/2006, 08h32
  4. Affichage des résultats d'un moteur de recherche
    Par poah dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 14h31
  5. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00

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