Rechercher une valeur dans un tableau

Résolu
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005 - 21 juin 2005 à 10:32
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 23 juin 2005 à 11:27
Bonjour,

je cherche à retrouver une valeur dans un tableau suite à une lecture de données par la requete suivante $result = mysql_query($query). du style
$valeur =$result[5] where $result[1]=xxx

L'idée c'est de ne faire qu'une seule fois la requete SQL

Merci

23 réponses

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 14:35
hum ok



tu peux passer le champ "act_actif" de T1 en TYNINT(1) au lieu de int



ça n'occupera plus qu'un octet au lieu de 4 par valeur.



Ensuite sur la table inscription, tu as trois clés, bref c'est inutile, supprime la clé act_id_2 et act_id_3



et pareil, remplace le INT(1) du champ insc_deleted par un TYNINT(1)



Ensuite fais un "OPTIMIZE TABLE activite,inscription"



et refais ensuite ta requête. Regarde le temps de génération et poste-le ici :-)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
3
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 juin 2005 à 11:05
Salut,



sois plus précis STP, ton explication est trop vague... Tu récupères une valeur avec MySQL et t'en fais quoi ensuite ?

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
21 juin 2005 à 11:28
En fait j'utilise 2 tables (T1 : activité, T2: inscription activité), par contre dans T2, il n'existe pas obligatoirement un enregistrement pour T1 (personne inscit à l'activité X)

Je veux faire la liste des activités et aussi afficher le nombre d'inscrits.
J'ai fait une premiere requete qui liste les activités, et pour chaque ligne je refait une seconde requete pour avoir le nombre d'inscrits, c'est un peu lourd et long.


Mon idée est de faire les 2 requetes (R1 : liste des activites, R2: nombre d'inscrits pour chaque activité). Et à l'affichage du résultat de R1 afficher la correspondance R2 (en utilisant un champs commun).

En espérant avoir été clair.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 juin 2005 à 11:43
hum ok :-)



essaie ceci :



SELECT t1.activite,COUNT(t2.id) FROM t1 LEFT JOIN t2 ON t1.activite=t2.id_activite GROUP BY t1.activite



le COUNT() te donnera le résultat du nombre de personnes comptabilisées



en gros chaque personne a un champ "id_activite" et la requête comptera
pour chaque activité le nombre de personnes ayant dans la table 2 le
champ "id_activite" identique



a ++

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
21 juin 2005 à 15:28
Effectivement ça marche, mais le problème c'est que la requete est hyper longue (les bases contiennes plus de 8000 enregistrements) temps de la requete +10 sec.

Alors que le requete de comptage sans la jointure est plus rapide, c'est pourquoi je voulais utiliser directement le résultat.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 juin 2005 à 17:33
Hum, tu as indexé certains champs ?



Tu peux donner la structure de ta table stp ?



Merci

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
21 juin 2005 à 18:44
T1 activite
act_id : index primaire
act_nom
act_actif

T2 inscription
insc_id : index primaire
act_id : activite
ent_id : id de l'inscrit
insc_deleted

requete :
select activite.act_id, act_nom, act_actif, count(insc_act.insc_id)
from activite T1
left join inscription T2 on T1.act_id=T2.act_id
group by activite.act_id
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 juin 2005 à 18:50
Rajoute un index dans ta table T2 sur le champ act_id



et regarde ensuite le temps d'exécution de la requête.

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
21 juin 2005 à 22:27
Effectivement, ça change, la requete c'est faite en 2 sec.

Existe-il un site qui donne des infos sur les indexs (que je ne maitrise pas du tout)

Merci.

Richard
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 juin 2005 à 22:36
2 secondes c'est encore énorme, rajoute un index sur le champ activite dans T1 (je l'avais pas vu)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
22 juin 2005 à 00:06
Activité est le nom de la base
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 00:08
file-moi la requête telle que tu l'as modifiée stp que je te dise quels champs indexer

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
22 juin 2005 à 11:17
Je n'ai pas modifié la requete
select T1.act_id, act_nom, act_actif, count(T2.insc_id)
from activite T1
left join inscription T2 on T1.act_id=T2.act_id
group by T1.act_id

seulement ajouté un index sur le champ T2.act_id via PHPMYADMIN
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 11:28
Ok donc en plus de tes clés uniques, tu vas mettre un index sur les
champs suivants (si le champ en question a déjà une clé unique tu
ne mets pas d'index)



- T1.act_id

- T2.act_id

- T2.insc_id



voilà



mesure le temps d'exécution de la requête ensuite

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
22 juin 2005 à 11:43
C'est déjà comme ça
- T1.act_id (index primaire)
- T2.act_id (index)
- T2.insc_id (index primaire)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 12:16
Quels sont les types de tes champs ? (fais une exportation de la structure de ta table dans phpmyadmin et colle-là ici stp)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
22 juin 2005 à 13:19
J'ai refais les index des bases, et re-lancer la requete
Affichage des enregistrements 0 - 29 (570 total, traitement: 0.1044 sec.)
J'ai dû me louper hier.

Merci beaucoup. C'est vrai que jusqu'a présent je ne prêtais pas trop d'attention aux index, je ferais plus attention dorénavant.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 13:21
attends y'a encore moyen d'optimiser. Tu fais quoi exactement ? un affichage page par page ?



si oui on peut utiliser le champ insc_id, mais j'attends ta réponse

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
richarddum Messages postés 54 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 20 décembre 2005
22 juin 2005 à 13:40
Non, je ne fais pas d'affichage page par page pour l'instant
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 juin 2005 à 13:42
Ok, tu peux coller la structure de ta table stp ? (dans phpmyadmin,
fais "exporter" coche "structure" et colle ici ce que ça te donne)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
Rejoignez-nous