Rechercher une valeur dans un tableau [Résolu]

Signaler
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005
-
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
-
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

Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

Activité est le nom de la base
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

C'est déjà comme ça
- T1.act_id (index primaire)
- T2.act_id (index)
- T2.insc_id (index primaire)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

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.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
54
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
20 décembre 2005

Non, je ne fais pas d'affichage page par page pour l'instant
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>