Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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

5 réponses

Avatar
Xavier_B
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" a écrit dans le message de news:
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

Avatar
Patrick Texier
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...)
<http://www.gpsql.org>
Avatar
Patrick Texier
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") ;
Avatar
Xavier_B

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



Merci ! Je vais essayer
Avatar
Fred Brouard - SQLpro
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