Un SELECT sur une grosse base

WRInaute discret
Bonjour à tous !

Voila j'essaye de puis quelques temps de faire fonctionner ce script :



Code:
                                            $sql = mysql_query("SELECT id,domaine FROM domaine WHERE ban='1' ORDER BY in_day DESC ");
							
                                            while($data=mysql_fetch_array($sql)){

							$i++;

							$tab[$i]["IN"] = $donnees[id];
							$tab[$i]["ID"] = $data[id];
							$tab[$i]["SITE"] = $data[domaine];

				$sql2 = mysql_query("SELECT COUNT(*) FROM visiteur WHERE id_domaine ='$data[id]' AND time >= '$time2' AND f='in'");
				$data2 = mysql_fetch_array($sql2);


							$tab[$i]["IN"] = $data2[id];

						
				$sql3 = mysql_query("SELECT COUNT(*) FROM visiteur WHERE id_domaine ='$data[id]' AND time >= '$time2' AND f='out'");
				$data3 = mysql_fetch_array($sql3);

							$tab[$i]["OUT"] = $data3[id];


								
								}

La table domaine ne fait que 200 enregistrements en revanche la table visiteur fait près de 1 049 675 d'entrées en progression.

Si ds la première requète je LIMIT à 5 domaine le script fonctionne en revance avec une plus grande valeur le script bloque au bout d'un moment, n'affiche rien sauf un tableau en double...

D'après vous où se trouve l'erreur je commence à tourner en rond.


merci par avance
 
WRInaute accro
peut être est-il possible que tu fasse une seule requête au lieu de faire des boucles comme ça.
Requêtes et sous-requêtes correlatives, quand tu nous tiens...
 
WRInaute occasionnel
si je comprends bien tu veux faire une requête qui te dis les gens qui rentrent et qui sortent par rapport à un domaine?

si c'est le cas, la liaison des tables et le group by sont tes amis dans tes requêtes et tu allègeras ta charge et ton temps d'exécution.
 
WRInaute accro
Hello

Une seule requête devrait te permettre de laisser MySQL faire les calculs à ta place :

Code:
SELECT Count(*) AS Decompte, visiteur.id_domaine, domaine.f FROM domaine INNER JOIN visiteur ON domaine.id=visiteur.id_domaine
GROUP BY visiteur.id_domaine, domaine.f 
HAVING domaine.ban=1 AND time>$time2

Bon pour la syntaxe c'est à revoir, je sais plus ce que MySQL supporte comme clauses ou pas, et comme je développe toute la journée avec du SQL Server, j'ai claqué une clause INNER JOIN mais je sais pas si MySQL supporte cela :roll:

Mais c'est pour l'idée.

Après tu récupères les données dans un tableau, ou tu auras dans la première colonne le décompte, la seconde le domaine, et la troisième le "in" ou le "out".


PS : pour le détail... Quand tu développes une base de données, nommes tes tables si possible "tbl_machin", le préfixe permet d'éviter de mélanger les noms de tables et les noms de champs !
 
WRInaute occasionnel
pour le détail aussi: le tableau est en double car tu utilises mysql_fetch_array, qui renvoie le tableau avec des indexs texte (id, etc) ET numeriques. utilises mysql_fetch_assoc pour n'avoir que les indexs textes (ceux que tu utilises)
 
WRInaute discret
Si je comprend bien avec ta méthode mon script ne comptiendrai plus que 2 Select...


Ensuite j'utilise une boucle avec mysql_fetch_assoc après chak requète pour récupèrer les valeurs pour chaque domaine c'est à dire le nombre de IN et de OUT dans la table visiteur...

c ça ou pas ?


cedric_g a dit:
Hello

Une seule requête devrait te permettre de laisser MySQL faire les calculs à ta place :

Code:
SELECT Count(*) AS Decompte, visiteur.id_domaine, domaine.f FROM domaine INNER JOIN visiteur ON domaine.id=visiteur.id_domaine
GROUP BY visiteur.id_domaine, domaine.f 
HAVING domaine.ban=1 AND time>$time2

Bon pour la syntaxe c'est à revoir, je sais plus ce que MySQL supporte comme clauses ou pas, et comme je développe toute la journée avec du SQL Server, j'ai claqué une clause INNER JOIN mais je sais pas si MySQL supporte cela :roll:

Mais c'est pour l'idée.

Après tu récupères les données dans un tableau, ou tu auras dans la première colonne le décompte, la seconde le domaine, et la troisième le "in" ou le "out".


PS : pour le détail... Quand tu développes une base de données, nommes tes tables si possible "tbl_machin", le préfixe permet d'éviter de mélanger les noms de tables et les noms de champs !
 
WRInaute occasionnel
c'est ça mais comme il l'a dit il faut changer la requête qui ne fonctionnera pas avec mysql (il me semble aussi qu'il faut que tu la rende mysql compatible). Ensuite, tu affiches le tableau en faisant le contrôle des valeurs que tu souhaite afficher ou pas.
 
Discussions similaires
Haut