Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2011, 09h26   #1
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
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
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h37   #2
Membre du Club
 
Inscription : février 2005
Messages : 94
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 94
Points : 69
Points : 69
Bonjour,

Tu peux essayer ça comme requête :

Code :
 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.
Kentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h51   #3
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
OK merci j'essaierai ce soir. Je te tiens au courant
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 14h21   #4
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
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
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h21   #5
Membre du Club
 
Inscription : février 2005
Messages : 94
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 94
Points : 69
Points : 69
Pour sélectionner le premier, il vaut mieux utiliser le MAX :

Code :
SELECT MAX(id) , nom, age FROM taTable
Pour le second, tu peux utiliser cette syntaxe :

Code :
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 ...
Kentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h46   #6
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
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 :
ageSqlite = sqlite3_column_int(compiledStatement,1);
mais la 2ème ?

En plus quand tu executes cette requete :
Code :
SELECT MAX(id) , nom, age FROM taTable
la table est-elle modifiée définitivement ou est-ce le temps de la requete ?
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h03   #7
Membre du Club
 
Inscription : février 2005
Messages : 94
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 94
Points : 69
Points : 69
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 :
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.
Kentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h12   #8
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
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 :
SELECT MAX(age) , nom, id FROM taTable OFFSET 1;
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 09h27   #9
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
Bonjour,

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

Code :
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
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h00   #10
Membre du Club
 
Inscription : février 2005
Messages : 94
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 94
Points : 69
Points : 69
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
Kentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h46   #11
Invité de passage
 
Inscription : septembre 2009
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 37
Points : 3
Points : 3
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
neospirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h24.


 
 
 
 
Partenaires

Hébergement Web