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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !]

n°680487
kalex
Posté le 22-03-2004 à 17:52:07  profilanswer
 

Salut, :hello:
J'utilise mysql 4 et il y a truc qui me dérange dans mon code actuel. Pour savoir combien de résultats j'aurais avec une commande j'utilise bien sûr count(*). Mais voilà, au delà d'un certain chiffre, ça ne m'intéresse plus de savoir si j'aurais 100 ou 10 000 résultats : je veux juste savoir si j'en aurais plus de 100.
Je me demande s?il n'y a pas moyen de spécifier qu'il n'est pas utile de compter au-delà de 100. Parceque sur des requêtes élaborées avec beaucoup de résultats, je commence à voir ma base ralentir. :sweat:
 
Y a-t-il un moyen ?


Message édité par kalex le 22-03-2004 à 22:55:38
mood
Publicité
Posté le 22-03-2004 à 17:52:07  profilanswer
 

n°680668
kalex
Posté le 22-03-2004 à 22:00:51  profilanswer
 

J'ai trouvé un moyen bien crade :

Code :
  1. SET @nb = 0;
  2. SELECT COUNT(@nb := @nb + 1) FROM T_TABLE WHERE @nb < 100;


Voili, voilou, j'aimerais bien trouver mieux. ;)


Message édité par kalex le 22-03-2004 à 22:01:44
n°680670
mrbebert
Posté le 22-03-2004 à 22:03:01  profilanswer
 

C'est vraiment plus performant :??:
 
(en tout cas, elle me plait beaucoup cette syntaxe :sol: )


Message édité par mrbebert le 22-03-2004 à 22:03:48
n°680671
jagstang
Pa Capona ಠ_ಠ
Posté le 22-03-2004 à 22:03:31  profilanswer
 

limit (5, 10)
 
les 10 suivants à partir du 5ème si ça peut t'aider


Message édité par jagstang le 22-03-2004 à 22:04:30
n°680679
kalex
Posté le 22-03-2004 à 22:06:39  profilanswer
 

mrbebert a écrit :

C'est vraiment plus performant :??:

D'après ce que je vois c'est vraiment minime...
Mais je ne l'ai pas encore testé sur mes grosses requêtes. ;)

n°680681
kalex
Posté le 22-03-2004 à 22:09:34  profilanswer
 

JagStang a écrit :

limit (5, 10)
 
les 10 suivants à partir du 5ème si ça peut t'aider

Merci, mais ceci limite les lignes retournées, et non pas les lignes comptées (par COUNT).

n°680683
jagstang
Pa Capona ಠ_ಠ
Posté le 22-03-2004 à 22:10:31  profilanswer
 

oui logique. sorry

n°680733
kalex
Posté le 22-03-2004 à 22:50:23  profilanswer
 

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:

n°680737
HappyHarry
Posté le 22-03-2004 à 22:56:53  profilanswer
 

kalex a écrit :

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:


 
et ca donne ? un gain effectif de ?

n°680741
kalex
Posté le 22-03-2004 à 23:02:54  profilanswer
 

HappyHarry a écrit :


 
et ca donne ? un gain effectif de ?

1er requête : 0.06 sec.
2em requête (limitée à 1000) : 0.01 sec.
 
Je signale que je suis dans de mauvaises situations pour tester : sous Windows XP (oui, je sais...). Je teste sous Linux dès que possible.

mood
Publicité
Posté le 22-03-2004 à 23:02:54  profilanswer
 

n°680885
mrbebert
Posté le 23-03-2004 à 09:55:14  profilanswer
 

kalex a écrit :

wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 ! :ouch:

:ouch:

n°683854
kalex
Posté le 25-03-2004 à 14:43:03  profilanswer
 

Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
 

Code :
  1. SELECT @nb := 0 AS NB, COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;


Sinon quelqu'un pourrait m'expliquer pourquoi, cette requête me donne une fois sur deux N_RES à 0 ? :??:

n°683868
kalex
Posté le 25-03-2004 à 14:46:30  profilanswer
 

Code :
  1. SET @nb = 0;
  2. SELECT COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;

Je précise que cette requête là me donne toujours N_RES à 100...

n°683918
mrbebert
Posté le 25-03-2004 à 15:00:03  profilanswer
 

kalex a écrit :

Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
 

Code :
  1. SELECT @nb := 0 AS NB, COUNT(@nb := @nb +1) AS N_RES FROM T_TABLE WHERE @nb < 100;


Sinon quelqu'un pourrait m'expliquer pourquoi, cette requête me donne une fois sur deux N_RES à 0 ? :??:

Chez moi, elle ne fonctionne pas 1 fois sur 2, mais seulement la première fois (comme si le "@nb := 0" n'étais jamais exécuté) [:figti]
 
edit : c'est encore plus subtil que ca :pt1cable:  
Si @nb est < 50 (pas forcément 0) avant la requête, ca donne le bon résultats. Si @nb est >= 50, la requête donne toujours 0 :sweat:


Message édité par mrbebert le 25-03-2004 à 15:04:20
n°683929
kalex
Posté le 25-03-2004 à 15:02:58  profilanswer
 

En tout cas, c'est bizarre. :/

n°684019
mrbebert
Posté le 25-03-2004 à 15:37:48  profilanswer
 

En mettant "... WHERE @nb <> 100", là, elle fonctionne 1 fois sur 2 (si pas de réinitialisation de @nb entre temps) [:figti]


Message édité par mrbebert le 25-03-2004 à 15:40:03
n°684058
kalex
Posté le 25-03-2004 à 15:58:44  profilanswer
 

J'ai pas ces comportements...
Pour moi, une fois ça marche pas (N_RES à 0), et une autre, ça marche (N_RES à 100). Dans le premier cas, "SELECT @nb;" me donne 0 et dans le second 100.
Par contre, il suffi que je réinitialise @nb à n'importe quel chiffre inférieur à 100 (avec "SET @nb = xx" ) pour que le résultat suivant soit bon (N_RES à 100).
J'en conclu que la condition (@nb < 100) est évaluée avant l'initialisation (@nb := 0). :o

n°684081
kalex
Posté le 25-03-2004 à 16:31:10  profilanswer
 

Pour tout faire en une seule requête (et deux lignes de résultat) :

Code :
  1. SELECT @nb := 0 AS N_RES UNION SELECT COUNT(@nb := @nb +1) FROM T_TABLE WHERE @nb < 100;


QQ1 voit autre chose ? :)

n°684091
mrbebert
Posté le 25-03-2004 à 16:47:31  profilanswer
 

kalex a écrit :

...
J'en conclu que la condition (@nb < 100) est évaluée avant l'initialisation (@nb := 0). :o

a mon avis, c'est le cas lorsqu'aucune ligne ne respecte le WHERE.
Par contre, s'il y en a, il ne réexécute pas le "@nb := 0" (sinon, l'incrémentation serait réinitialisée à chaque fois) [:figti]

n°684123
kalex
Posté le 25-03-2004 à 17:12:18  profilanswer
 

Je pense que c'est logique puisque la requête retourne quand même une ligne (COUNT retourne 0).
 
Donc, si @nb est supérieur à 100, il n'y a aucune ligne correspondante (puisque @nb < 100 est faux), MySQL exécute COUNT (qui retourne 0), et "@nb := 0".
Pour la requête suivante, @nb est inférieur à 100, donc ça roule...


Message édité par kalex le 25-03-2004 à 17:13:33
n°851419
kalex
Posté le 16-09-2004 à 02:22:11  profilanswer
 

Je up au cas où, depuis le temps, un nouveau aurait une solution plus "standardisée". :o

n°854791
surfacing
Posté le 21-09-2004 à 13:24:54  profilanswer
 

salut
pas de solution pour toi
mais si t'es sous sql server,t'a essayé de tapper dans les tables systemes pour voir le nombre d'enregistrements retournées pour ta table. Si les statistics, sont en auto-update, ca devrait etre relativement fiable. M'enfin dans ton cas pour determiner si il y a seulement plus de 100 records, ca va pas aller bcp plus vite.

mood
Publicité
Posté le   profilanswer
 


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

  Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !]

 

Sujets relatifs
Ma requete SQL marche mais ne me renvoie rien !Comptage de lignes de code C ou Java sous Windows
[C] Comment ca marche??[JS]Fonction qui marche une fois, pas deux.
Programme en C qui affiche n lignes demandésExtensions Frontpage chez Multimania.fr (lycos)... marche pas??
comment déclarer un nombre absolue en php ?calcul du nombre de jours ouvrés entre 2 dates
htmlconverter comment ca marche?[Eclipse] Plusieurs lignes de tabs dans l'IDE ?
Plus de sujets relatifs à : Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !]


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