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

SQLite Discussion :

Récupérer les 2 premières valeurs max d'une BDDSQLite


Sujet :

SQLite

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut Récupérer les 2 premières valeurs max d'une BDDSQLite
    Bonjour à tous et bonne année !!!

    Je suis en train de chercher un moyen pour récupérer les 2 valeurs max ainsi que les autre éléments de ces 2 lignes dans une base SQLite.

    id | nom | age |
    1 toto 23
    2 tata 28
    3 copain 15
    4 pouet 30

    Donc , dans cet exemple, je voudrai récupérer les 2 lignes :

    2 tata 28
    4 pouet 30

    Est-il possible de faire cela avec une seule requête ?


    Merci pour votre aide

    neospirit

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Points : 98
    Points
    98
    Par défaut
    Bonjour,

    Tu peux essayer ça comme requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT id, nom, age FROM taTable ORDER BY age DESC LIMIT 2;
    Elle sélectionne les deux premières lignes contenant tes infos en les triant par âge dans l'ordre décroissant.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    OK merci j'essaierai ce soir. Je te tiens au courant

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    En fait en allant plus loin, je voudrais récupérer le 1er maximum de la liste (4 pouet 30) et récupérer le 2ème maximum (2 tata 28).

    Pour le 1er je pense savoir le faire grâce à l'instruction que tu m'as donné mais pour le 2ème, je vois pas trop...


    Merci

    neospirit

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Points : 98
    Points
    98
    Par défaut
    Pour sélectionner le premier, il vaut mieux utiliser le MAX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(id) , nom, age FROM taTable
    Pour le second, tu peux utiliser cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, nom, age FROM taTable ORDER BY age DESC LIMIT 1 OFFSET 1;
    Pour plus d'infos, c'est par là: http://www.sqlite.org/lang_select.html

    Mais le plus simple, c'est de récupérer les 2 résultats en même temps (avec la première requête du post) , puis dans ton code, tu sais que la première ligne correspond au 1er, que la deuxième ligne correspond au 2éme ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Je veux bien récupérer les 2 résultats en même temps mais je ne vois pas comment. Je comprends bien comment récupérer la 1ère avec par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ageSqlite = sqlite3_column_int(compiledStatement,1);
    mais la 2ème ?

    En plus quand tu executes cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(id) , nom, age FROM taTable
    la table est-elle modifiée définitivement ou est-ce le temps de la requete ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Points : 98
    Points
    98
    Par défaut
    Ma requête ne modifie rien du tout. Elle lit juste les données dans la table et sélectionne l'age max.

    Je viens de voir qu'elle comporte une erreur car elle sélectionne l'id le plus grand et non l'age. Donc la bonne requête sera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(age) , nom, id FROM taTable
    Pour sélectionner plusieurs résultats en même temps, regarde sur des tutoriels. Ça sera plus parlant.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Je n'ai pas trouvé exactement dans les tutos ce que je voulais c'est pourquoi j'en suis à l'étape forum.

    Si j'ajoute un offset sur le MAX pour avoir le 2ème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(age) , nom, id FROM taTable OFFSET 1;

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    j'ai finalement trouvé une solution. Je sais pas si c'est la meilleure mais voilà :

    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
    const char *sqlStatement = "SELECT id,nom,age FROM table ORDER BY age DESC LIMIT 2";
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
    BOOL firstWhile = NO;
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
    	if(firstWhile){
    		idSqlite2 = sqlite3_column_int(compiledStatement, 0);
    		nomSqlite2 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
    		ageSqlite2 = sqlite3_column_int(compiledStatement, 2);
    	}
    	if(!firstWhile){
    		idSqlite = sqlite3_column_int(compiledStatement, 0);
    		nomSqlite = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
    		ageSqlite = sqlite3_column_int(compiledStatement, 2);
    		firstWhile = YES;
    	}
    }		
    }
    C'est peut-être pas de la bonne programmation mais ça a le mérite de fonctionner.

    Qu'en pensez-vous ?

    neospirit

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 94
    Points : 98
    Points
    98
    Par défaut
    Regarde ce tuto dans la partie 5 (The Coding begins!), tu peux voir du code pour parcourir les lignes retournées par tes requêtes : http://dblog.com.au/iphone-developme...lite-database/

    Sinon tu peux utiliser des librairies pour faciliter l'accès à ta base de données : http://stackoverflow.com/questions/6...lite-on-iphone

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Oui j'ai déjà regardé ce tuto. Il a d'ailleurs été repris et traduit et quelque peu modifié par le site iPuP (tuto n°14). Je m'en suis beaucoup inspiré également pour développer la partie SQLite de mon appli.

    Cependant le "while" qui permet de mettre les données de la BDD dans un tableau d'objets ne me convient pas.

    Les autres librairies, dont fmdb, m'apportent encore plus de confusion. Je suis un débutant et j'utilise très légèrement le SQLite dans mon appli iPhone. Le framework SQLite d'origine livré avec XCode convient à une utilisation très basique je pense.

    J'essaie juste de savoir si mon modeste bout de code est quelque chose qui peut se faire ou bien si cela génèrera des problèmes ?

    Merci
    neospirit

Discussions similaires

  1. Sélectionner les N valeurs max d'une table
    Par folefevre dans le forum SAS Base
    Réponses: 30
    Dernier message: 07/03/2011, 17h42
  2. Réponses: 12
    Dernier message: 04/02/2009, 12h44
  3. Réponses: 2
    Dernier message: 01/12/2006, 10h09
  4. Comment récupérer les coordonnées sur le bureau d'une form ?
    Par fma2112 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 22/02/2006, 23h43
  5. Récupérer les deux premières lettres d'une chaine
    Par moscovisci dans le forum ASP
    Réponses: 3
    Dernier message: 10/01/2006, 14h53

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