SQL... TOP 3-3 ??

SQL... TOP 3-3 ?? - SQL/NoSQL - Programmation

Marsh Posté le 04-07-2004 à 08:26:37    

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

Reply

Marsh Posté le 04-07-2004 à 08:26:37   

Reply

Marsh Posté le 04-07-2004 à 10:24:29    

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
Reply

Marsh Posté le 04-07-2004 à 22:43:33    

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?  
Reply

Marsh Posté le 04-07-2004 à 22:48:17    

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
Reply

Marsh Posté le 04-07-2004 à 22:53:19    

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?  
Reply

Marsh Posté le 04-07-2004 à 23:20:34    

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

Reply

Marsh Posté le 05-07-2004 à 09:39:35    

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

Reply

Marsh Posté le 05-07-2004 à 20:03:27    

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

Reply

Marsh Posté le 05-07-2004 à 20:06:48    

:jap:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 05-07-2004 à 20:08:12    

c'est ce que je proposais plus haut ;)

Reply

Marsh Posté le 05-07-2004 à 20:08:12   

Reply

Marsh Posté le 05-07-2004 à 20:10:06    

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

Reply

Marsh Posté le 05-07-2004 à 20:11:37    

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
Reply

Marsh Posté le 05-07-2004 à 20:18:15    

: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.

Reply

Marsh Posté le 05-07-2004 à 20:19:23    

[:branlette]


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 24-03-2006 à 14:20:31    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed