Si tu ne comptes pas parcourir le résultat, il vaut mieux faire un "SELECT count(*) as total FROM ...."
Comme ca, il te renvoie uniquement le nombre de lignes plutot que de manipuler une grosse quantité de données pour rien
Quoique, il y aurait encore plus efficace En faisant un count(*), il te renvoie moins de données, mais doit tout de même parcourir les tables pour déterminer combien de lignes sont concernées
Le plus efficace serait donc de ne pas faire de count(*), mais plutot de rajouter un ' ... LIMIT 0, 1' à la fin de ta requête (je considère que tu utilise mysql )
En faisant ca, tu indiques au serveur de s'arrêter dès qu'il a trouvé une ligne qui convient à la requête. Il ne te reste plus qu'à vérifier si tu as 1 ligne ou pas dans ton résultat
Message édité par mrbebert le 18-06-2003 à 21:47:23
Quoique, il y aurait encore plus efficace En faisant un count(*), il te renvoie moins de données, mais doit tout de même parcourir les tables pour déterminer combien de lignes sont concernées
Le plus efficace serait donc de ne pas faire de count(*), mais plutot de rajouter un ' ... LIMIT 0, 1' à la fin de ta requête (je considère que tu utilise mysql )
En faisant ca, tu indiques au serveur de s'arrêter dès qu'il a trouvé une ligne qui convient à la requête. Il ne te reste plus qu'à vérifier si tu as 1 ligne ou pas dans ton résultat
Bien entendu, il faudrait enlever le 'ORDER BY' C'est inutile de lui demander de trier les lignes (ce qui l'oblige à tout lire, même avec un LIMIT 0, 1 ) si la seule chose qui t'intéresse est de tester l'existence d'un résultat
(promis, là, j'ai plus rien à dire )
edit concernant le mysql_free_result : dans tous les cas, les résultats sont effacés à la fin du script. Disons que c'est utile si as des résultats relativement gros. Si tu récupère juste quelques lignes, tu peux les "oublier", ca pose pas de problème
Message édité par mrbebert le 18-06-2003 à 22:02:01
burgergold
5$? va chez l'diable!
Posté le 18-06-2003 à 22:04:10
le order by est disparu depuis que j'ai mis le count, t'inquiète
j'ai dejà eu des classes de sql, mais ca date de bientot 2ans alors faut s'y remettre
$query = "SELECT count(*) AS TOTAL FROM t_menu WHERE menu_subID = " . $_POST['subid'] . " AND menu_title = \"" . $_POST['title'] . "\" LIMIT 0, 1";
$menu_exist = mysql_query ($query) or die ("Requête invalide" );
print mysql_fetch_array($menu_exist);
mon fetch me retourne "array" alors que j'mattends à recevoir 0 ou 1...
Tous les SELECT renvoient un résultat à parcourir avec mysql_fetch_array. Simplement, dans le cas de ta requête, il n'y a qu'une ligne et qu'une colonne Je pense que cette colonne s'appelle 'count(*)', mais le plus simple, c'est de la renommer :
$menu_exist = mysql_query ("SELECT count(*) as total ... " );
$r = mysql_fetch_array($menu_exist);
$total = $r['total'];
Sinon, dans ta requête, ca ne sert à rien de mettre un LIMIT 0, 1 puisque le count(*) dans le select fait qu'il n'y aura qu'une seule ligne renvoyée
Message édité par mrbebert le 19-06-2003 à 19:04:53
Tous les SELECT renvoient un résultat à parcourir avec mysql_fetch_array. Simplement, dans le cas de ta requête, il n'y a qu'une ligne et qu'une colonne Je pense que cette colonne s'appelle 'count(*)', mais le plus simple, c'est de la renommer :
$menu_exist = mysql_query ("SELECT count(*) as total ... " );
$r = mysql_fetch_array($menu_exist);
$total = $r['total'];
Sinon, dans ta requête, ca ne sert à rien de mettre un LIMIT 0, 1 puisque le count(*) dans le select fait qu'il n'y aura qu'une seule ligne renvoyée
ahhh javais pas bien lu qu'en utilisant le limit, on n'utilisait plus le count