SQL - Quantième d'une série d'enregistrements

Le
Xavier_B
Bonjour

Je souhaiterais trouver dans une table, le n-ième élément.
Par exemple, disons que j'ai une table "pays" avec comme champs :
id_pays,nom_pays,superficie_pays

Je cherche le 10ème pays le plus vaste
Evidemment, je peux faire un truc du genre :
$Compteur=0;
$Requete="Select * from pays order by superficie_pays desc";
$Query= $mysql_query($Requete);
While ($Compteur<10)
{
$Compteur=$Compteur+1;
$Result=mysql_fetch_array($Query);
}
echo "10 ème pays le plus vaste : ".$Result["nom_pays"]." avec une
superficie de ".$Result["superficie_pays"]." km²";

Mais, y a-t-il une méthode plus directe. Je préfèrerais, car j'ai un peu
plus de 10 enregistrements ;-)

Merci d'avance pour vos lumières
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Xavier_B
Le #21862351
Holà ! Je raconte n'importe quoi. En fait ma question serait plutôt : "Quel
est le rang de tel pays, par exemple la France, en termes de superficie ?"

Y a-t-il une autre solution que :

$Compteur=1;
$Requete="Select * from pays order by superficie_pays desc";
$Query= $mysql_query($Requete);

$Result=mysql_fetch_array($Query);
While ($Result["nom_pays"]<>'France')
{
$Compteur=$Compteur+1;
$Result=mysql_fetch_array($Query);
}
echo "La France est le ".$Compteur." avec une superficie de
".$Result["superficie_pays"]." km²";

Merci !

"Xavier_B" 460d009c$0$27374$
Bonjour

Je souhaiterais trouver dans une table, le n-ième élément.
Par exemple, disons que j'ai une table "pays" avec comme champs :
id_pays,nom_pays,superficie_pays

Je cherche le 10ème pays le plus vaste
Evidemment, je peux faire un truc du genre :
$Compteur=0;
$Requete="Select * from pays order by superficie_pays desc";
$Query= $mysql_query($Requete);
While ($Compteur<10)
{
$Compteur=$Compteur+1;
$Result=mysql_fetch_array($Query);
}
echo "10 ème pays le plus vaste : ".$Result["nom_pays"]." avec une
superficie de ".$Result["superficie_pays"]." km²";

Mais, y a-t-il une méthode plus directe. Je préfèrerais, car j'ai un peu
plus de 10 enregistrements ;-)

Merci d'avance pour vos lumières

Patrick Texier
Le #21862311
Le Fri, 30 Mar 2007 14:41:26 +0200, Xavier_B a écrit :

Holà ! Je raconte n'importe quoi. En fait ma question serait plutôt : "Quel
est le rang de tel pays, par exemple la France, en termes de superficie ?"

Y a-t-il une autre solution que :

$Compteur=1;
$Requete="Select * from pays order by superficie_pays desc";
$Query= $mysql_query($Requete);

$Result=mysql_fetch_array($Query);
While ($Result["nom_pays"]<>'France')
{
$Compteur=$Compteur+1;
$Result=mysql_fetch_array($Query);
}



Ici, il y a peu de risques mais dans le cas général il faut tester si la
valeur est bien différente de la précédente avant d'incrémenter le rang.
Ceci oblige effectivement à lire tous les enregistrements avant. Vous
pouvez quand même limiter le SELECT en ne prenant que les superficies
supérieures avec une requête imbriquée :

select *
from pays
where superficie_pays >=
(select superficie_pays
where nom_pays = "France")
order by superficie_pays desc ;
--
Patrick Texier
Base de données libre de résultats de grands-prix.
(F1, GP pre-1950, F2, F3000, GP2, A1GP, IRL, ChampCars...)
Patrick Texier
Le #21862301
Le Fri, 30 Mar 2007 14:41:26 +0200, Xavier_B a écrit :

Holà ! Je raconte n'importe quoi. En fait ma question serait plutôt : "Quel
est le rang de tel pays, par exemple la France, en termes de superficie ?"



Il faudrait vérifier avant d'incrémenter le rang que la valeur est
différente de la précédente.

Si vous avez besoin de la liste, vous pouvez la limiter ainsi :

select *
from pays
where superficie_pays >=
(select superficie_pays
where nom_pays = "France")
order by superficie_pays desc ;

Sinon, il suffit de compter le nombre de valeurs supérieures et
d'ajouter un :

select count(*) + 1 as rang
from pays
where superficie_pays >=
(select superficie_pays
where nom_pays = "France") ;
Xavier_B
Le #21862291

select count(*) + 1 as rang
from pays
where superficie_pays > > (select superficie_pays
where nom_pays = "France") ;



Merci ! Je vais essayer
Fred Brouard - SQLpro
Le #21841781
Bonjour,

En utilisant les fonctions de fenêtrage de la norme SQL:2003 et en
combinant cela avec une sous requête en table dérivée :

SELECT *
FROM (SELECT *, RANK() OVER (ORDER BY superficie_pays desc) AS RANG
FROM pays) AS T
WHERE RANG = 10

Si votre SGBDR supporte les expressions de tables (CTE) :

WITH T
AS (SELECT *, RANK() OVER (ORDER BY superficie_pays desc) AS RANG
FROM pays)
SELECT *
FROM T
WHERE RANG = 10

Vous touverez de plus amples informations sur ces sujets dans les pages
145 et suivantes et 186 et suivantes de mon livre sur SQL, co écrit avec
Christian Soutou.

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


Xavier_B a écrit :
Bonjour

Je souhaiterais trouver dans une table, le n-ième élément.
Par exemple, disons que j'ai une table "pays" avec comme champs :
id_pays,nom_pays,superficie_pays

Je cherche le 10ème pays le plus vaste
Evidemment, je peux faire un truc du genre :
$Compteur=0;
$Requete="Select * from pays order by superficie_pays desc";
$Query= $mysql_query($Requete);
While ($Compteur<10)
{
$Compteur=$Compteur+1;
$Result=mysql_fetch_array($Query);
}
echo "10 ème pays le plus vaste : ".$Result["nom_pays"]." avec une
superficie de ".$Result["superficie_pays"]." km²";

Mais, y a-t-il une méthode plus directe. Je préfèrerais, car j'ai un peu
plus de 10 enregistrements ;-)

Merci d'avance pour vos lumières


Publicité
Poster une réponse
Anonyme