Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1076 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL... TOP 3-3 ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

SQL... TOP 3-3 ??

n°785970
Bidoup
Posté le 04-07-2004 à 08:26:37  profilanswer
 

Allo, je voudrais savoir comment faire pour obtenir les résultats qui vinnent apres les 3 premiers, par exemple  
 
si jai 6 enregistrements
je veut les enregistrement
 
4
5
6 au lieu de  
 
1
2
3
 
ya tu un genre de TOP 3 - 3 ou de koi comme ca? merci

mood
Publicité
Posté le 04-07-2004 à 08:26:37  profilanswer
 

n°785996
Beegee
Posté le 04-07-2004 à 10:24:29  profilanswer
 

Je cite la doc MySql :
 
"La clause LIMIT peut être utilisée pour limiter le nombre d'enregistrements retournés par la commande SELECT. LIMIT accepte un ou deux arguments numériques. Ces arguments doivent être des entiers constants. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décallage du premier enregistrement est 0 (pas 1):
mysql> SELECT * FROM table LIMIT 5,10;  # Retourne les enregistrements 6 à 15"
 
http://dev.mysql.com/doc/mysql/fr/SELECT.html
 
Donc dans ton cas, il faut faire quelquechose comme :
SELECT *
FROM maTable
WHERE ...
ORDER BY monIdentifiant
LIMIT 2,3;
 
edit: vu ton énoncé, c'est peut-être plutôt en Access qu'en mySql, non ? va falloir chercher l'équivalent pour Access alors ...


Message édité par Beegee le 04-07-2004 à 10:27:13
n°786472
jagstang
Pa Capona ಠ_ಠ
Posté le 04-07-2004 à 22:43:33  profilanswer
 

TOP n'existe pas en MySQL. c'est sans doute Sql Server ou Access.
 
Tu peux faire une sous requête.  
 
SELECT TOP 3 FROM maTable WHERE id NOT IN (SELECT TOP 3 FROM maTable)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°786482
Beegee
Posté le 04-07-2004 à 22:48:17  profilanswer
 

ouaip, pas très performant quand même ... il doit y avoir un autre moyen ...
 
en fait, je pense que le plus rapide serait :
SELECT TOP 3 FROM (SELECT TOP 6 FROM maTable ORDER BY id ASC) ORDER BY id DESC;
 
:D
 
(ça marche seulement si le ORDER BY se fait avant le TOP, mais il me semble que c'est le cas)


Message édité par Beegee le 04-07-2004 à 22:50:54
n°786490
jagstang
Pa Capona ಠ_ಠ
Posté le 04-07-2004 à 22:53:19  profilanswer
 

non je crois qu'il y a pas mieux. peut-être une jointure =*. bien sûr que le order by se fait avant...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°786517
Bidoup
Posté le 04-07-2004 à 23:20:34  profilanswer
 

j'ai trouver...  
 
et puis oui cest en access, dsl :P
 
NombreTopNews = 2
 RS.Open "SELECT  TOP " & 8+NombreTopNews & " * FROM news ORDER BY Date DESC, Heure DESC", Conn
 
 For i = 0 to NombreTopNews
  RS.MoveNext
 Next

n°786633
Beegee
Posté le 05-07-2004 à 09:39:35  profilanswer
 

forcément, le plus simple c'était de le faire dans le code appelant, c'est sûr ... mais on cherchait le moyen de le faire dans la requête :p

n°787287
Arjuna
Aircraft Ident.: F-MBSD
Posté le 05-07-2004 à 20:03:27  profilanswer
 

Moyen le plus "propre", qui fait exactement un LIMIT, et qui est relativement rapide (plus rapide qu'un NOT IN en tout cas)
 
http://forum.zozoll-online.com/topic.asp?t=908

n°787292
jagstang
Pa Capona ಠ_ಠ
Posté le 05-07-2004 à 20:06:48  profilanswer
 

:jap:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°787295
Beegee
Posté le 05-07-2004 à 20:08:12  profilanswer
 

c'est ce que je proposais plus haut ;)

mood
Publicité
Posté le 05-07-2004 à 20:08:12  profilanswer
 

n°787296
Arjuna
Aircraft Ident.: F-MBSD
Posté le 05-07-2004 à 20:10:06  profilanswer
 

Vi mais ton truc il est pas dans l'ordre (oui je sais, je pinaille ;))

n°787297
Beegee
Posté le 05-07-2004 à 20:11:37  profilanswer
 

ben oui mais j'ai jamais travaillé sous access, donc je pouvais pas savoir si le ORDER BY se fait avant le TOP ou non ;)
 
edit : en effet, il faut faire un autre order by pour les avoir dans l'ordre 4 / 5 / 6, mais c'était pas précisé clairement dans l'énoncé :D


Message édité par Beegee le 05-07-2004 à 20:12:43
n°787304
Arjuna
Aircraft Ident.: F-MBSD
Posté le 05-07-2004 à 20:18:15  profilanswer
 

:p
 
Avec Access/MySQL le TOP tiens compte de l'odre (heureusement, parceque sinon...)
 
En fait, le top s'occume juste d'ouvrir un curseur qu'il ne peuple qu'avec les x premières lignes retournées par la requête.

n°787306
jagstang
Pa Capona ಠ_ಠ
Posté le 05-07-2004 à 20:19:23  profilanswer
 

[:branlette]


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1331728
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-03-2006 à 14:20:31  profilanswer
 

Yo !
 
En quête d'une meilleure solution que celle que j'avais posté à l'époque, un pote me dit par mail "ouais, mais si tu veux les lignes 1 000 000 000 à 1000 000 010, ça rame avec le coup des orders.
 
Pas convaincu par ses dires, je teste (y'a que ça de vrai :D)
 
Et il a raison, les order by dans tous les sens, c'est tout pourri ça sent mauvais des pieds.
 
Mais rien ne me résiste. J'ai trouvé ze truc de la mort qui tue la vie jusqu'à ce qu'elle soit morte.
 
Voici mon mail :
 

Citation :


Je suis pas certain que le coup des TOP soit si lent que ça avec beaucoup de données. Après, ça dépends surtout si l’appli tourne sur le serveur BDD ou non.
 
->      Ben si en fait.
->      ATTENTION : Mon génie créatif viens de trouver le truc qui déchire sa race, je te trouve les infos en 1 seconde maintenant !!! (voir tout en bas)
 
Sur mon poste (SQL Server 2000 / HDD de portable / 512 Mo RAM)
 
Select count(*) from evl
->     413933 en 17 secondes
 
Select * from evl order by numeve (non indexée)
->     2 minutes 40 secondes pour retourner les lignes + chargement des données
 
select *  
from (
            select top 20 *  
            from (  
                        select top 400000 *  
                        from evl  
                        order by numeve ) as t1  
            order by numeve DESC) as t2  
order by numeve
->     Plus de 5 minutes (stoppé) pour retourner les lignes + chargement des données
 
create index ix_numeve on evl (numeve)
->     17 secondes
 
Select * from evl order by numeve (non indexée)
->     1 minute 58 secondes pour retourner les lignes + chargement des données
 
select *  
from (
            select top 20 *  
            from (  
                        select top 400000 *  
                        from evl  
                        order by numeve ) as t1  
            order by numeve DESC) as t2  
order by numeve
->     Plus de 3 minutes 26 pour retourner les lignes + chargement des données
 
 
HOURRA !!!!!
 
Je crois que je viens de trouver !!!!!
 
select top 20 *
from evl
where numeve > (select max(numeve) from (select top 400000 numeve from evl order by numeve) t)
order by numeve
-> 1 seconde !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Si le critère de tri peut être étendu à une PK ça semble marcher :)


Message édité par Arjuna le 24-03-2006 à 14:22:59

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL... TOP 3-3 ??

 

Sujets relatifs
[SQL Server 2000] Connexion sécurisée ?[Oracle/PL-SQL] Passer un tableau en paramètre d'une procedure stockée
Problème de requetes SQLRequête SQL et résultat
DBExpress SQL Server[php/SQL] ajouter des enregistrement a laide d'une textarea
[SQL][ASP] affiche des résultats de 2tables avec même nom de colonnes[Oracle/SQL] Différencier des séries de chiffres et de lettres
[php/SQL] filtre sur une liste deroulante[SQL] dileme (besoin d'un conseil)
Plus de sujets relatifs à : SQL... TOP 3-3 ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR