SQL... TOP 3-3 ?? - SQL/NoSQL - Programmation
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 ...
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)
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;
(ça marche seulement si le ORDER BY se fait avant le TOP, mais il me semble que c'est le cas)
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...
Marsh Posté le 04-07-2004 à 23:20:34
j'ai trouver...
et puis oui cest en access, dsl
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
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
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
Marsh Posté le 05-07-2004 à 20:06:48
Marsh Posté le 05-07-2004 à 20:10:06
Vi mais ton truc il est pas dans l'ordre (oui je sais, je pinaille )
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é
Marsh Posté le 05-07-2004 à 20:18:15
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.
Marsh Posté le 05-07-2004 à 20:19:23
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 )
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 : |
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