Un SELECT sur une grosse base

millowas
WRInaute discret
WRInaute discret
 
Messages: 54
Inscription: 22 Jan 2006

Un SELECT sur une grosse base

Message le Mer Aoû 08, 2007 20:14

Bonjour à tous !

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



Code: Tout sélectionner
                                            $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


TOMHTML
WRInaute accro
WRInaute accro
 
Messages: 3250
Inscription: 25 Aoû 2004

Message le Mer Aoû 08, 2007 21:01

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


erestrebian
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 473
Inscription: 15 Juin 2007

Message le Jeu Aoû 09, 2007 8:20

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.


cedric_g
WRInaute accro
WRInaute accro
 
Messages: 3552
Inscription: 18 Jan 2006

Message le Jeu Aoû 09, 2007 9:24

Hello

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

Code: Tout sélectionner
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 !

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Jeu Aoû 09, 2007 10:38

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)

millowas
WRInaute discret
WRInaute discret
 
Messages: 54
Inscription: 22 Jan 2006

Message le Jeu Aoû 09, 2007 17:48

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 écrit:Hello

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

Code: Tout sélectionner
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 !


erestrebian
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 473
Inscription: 15 Juin 2007

Message le Ven Aoû 10, 2007 7:58

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.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité