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 :

position dans une liste triée


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut position dans une liste triée
    Bonjour

    je cherche à faire une requête mais je n'y arrive pas sans faire de boucle php avec
    j'ai dans une table "membres" les champs "id", "pseudo", "enigme"
    et je voudrais retourner la position d'un membre précis en fonction de l'énigme où il en est
    pour le moment je gère comme ceci (en schématisant un peu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $pos = 1;
    requete("select id, pseudo, enigme from membres")
    while(j'ai des résultats)
    {
       if(pseudo == ce que je recherche)
       {
          echo $pos;
          break;
       }
     
       $pos++;
    }
    mais j'aimerais déterminé cette position sans php uniquement avec une requête

    merci de votre aide

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Si tu ne gères pas les cas d'égalités, tu peux utiliser rownum avec un order by.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select rang
    from
    (
    select rownum as rang, pseudo
    from membres
    order by enigme 
    )
    where pseudo = 'Toto'
    Sinon une requête gore qui simule le comportement de la fonction analytique rank() d'Oracle (gère les cas d'égalités donc !) :

    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
    -- Somme les joueurs qui ont fait mieux que le joueur Toto, 
    -- ce qui doit donner son rang
    SELECT sum(num) + 1 AS rang
    FROM
    (
      -- Compte le nombre de joueurs étant arrivé à chaque énigme
      SELECT count(1) AS num, enigme  
      FROM membres t 
      GROUP BY enigme 
    )
    WHERE enigme < (
                       SELECT enigme  
                       FROM membres
                       WHERE pseudo = 'Toto'
                     )

    Edit : désolé, je pensais que rownum était standard SQL
    Dernière modification par Scorpi0 ; 27/11/2008 à 15h06.

  3. #3
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut
    j'ai testé ta requête mais elle ne passe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT rang
    FROM
    (
    SELECT rownum AS rang, pseudo
    FROM membres
    ORDER BY enigme 
    )
    WHERE pseudo = 'toto'
    j'ai tourné un peu les choses en rajoutant un "select rang from enigmes" et d'autres choses mais ça ne passe pas

    de plus j'ai vu que rownum est utilisable sous oracle, je ne l'ai pas précisé mais je suis sous mysql5

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Citation Envoyé par Scorpi0 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select rang
    from
    (
    select rownum as rang, pseudo
    from membres
    order by enigme 
    )
    where pseudo = 'Toto'
    Fais juste gaffe à un truc : ROWNUM est calculé avant le ORDER BY...
    (fais le test).

    Encapsule ta requête avec order by sans le rownum, puis fais un rownum à l'extérieur...
    (Puis éventuellement une sur requête de plus pour récupérer le bon )

    => Bien entendu, c'est mieux avec les fonctions analytiques

  5. #5
    Scorpi0
    Invité(e)
    Par défaut
    Ha ?
    J'ai testé sous Oracle 9i et il me renvoyait les bons rangs bien triés pourtant !

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tiens, on peut faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as (
    select 'Squelettor' as nom FROM DUAL UNION ALL
    select 'Marcel' as nom FROM DUAL UNION ALL
    select 'Robert' as nom FROM DUAL UNION ALL
    select 'Pacmann' as nom FROM DUAL)
    SELECT ROWNUM, nom
    FROM tmp
    ORDER BY nom
    ROWNUM NOM
    2 Marcel
    4 Pacmann
    3 Robert
    1 Squelettor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    with tmp as (
    select 'Squelettor' as nom FROM DUAL UNION ALL
    select 'Marcel' as nom FROM DUAL UNION ALL
    select 'Robert' as nom FROM DUAL UNION ALL
    select 'Pacmann' as nom FROM DUAL)
    SELECT ROWNUM, nom
    FROM (
    SELECT nom
    FROM tmp
    ORDER BY nom
    ) t
    ROWNUM NOM

    1 Marcel
    2 Pacmann
    3 Robert
    4 Squelettor


    => En 9iR2
    En fait, t'as peut être juste eu du bol.
    Je suppose que si ta colonne est indexée, il utilise l'indexe pour ramener les lignes et s'économiser le sort... et du coup, tu as les bons rangs

  7. #7
    Scorpi0
    Invité(e)
    Par défaut
    Arf, j'ai du me faire avoir par mon coup de chance ^^
    Faire 3 sous requêtes pour ça, effectivement, vive les fonctions analytiques

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

Discussions similaires

  1. Position dans une liste
    Par dominos dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2013, 17h33
  2. Position dans une liste en HTA
    Par papyxy dans le forum VBScript
    Réponses: 2
    Dernier message: 20/10/2012, 13h16
  3. Réponses: 1
    Dernier message: 05/06/2009, 18h59
  4. Position dans une liste hétérogène
    Par mister2502 dans le forum Général Python
    Réponses: 17
    Dernier message: 24/04/2009, 14h10
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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