Page 1 sur 2
[Resolu] Optimisation de requetes PHP
Posté : 13 mars 2007, 14:28
par dogmongo
Bonjour à tous
j'ai crée une page avec 5 requete sur la même table
elle ont toute un champs différent qui me permet de trier les donnés
voici l'une d'elle , sachant que je répete les mêmes en modifiant uniquement "cat"
cat1 cat2 cat3 etc...
<?
$q = "SELECT * FROM matable WHERE cat='cat1' and val='1' ";
$mysql_result = execute_requete($q);
while($r = mysql_fetch_array($mysql_result)) {
$champ1= $r['champ1'];
$champ2 = $r['champ2'];
$AF.= "<table>
<tr>
<td>
$champ1<br>
$champ2</td>
</tr>
</table>\n";
}
echo $AF;
?>
ci dessus une requete !
pourrai-je rassembler mes 5 tableaux et générer un trie en une seul requete ?
ma demande est dans le but d'optimiser mon site et mon serveur
merci d'avance

Posté : 13 mars 2007, 16:17
par jobi1722
Bonjour,
je ne sais pas si ce serait optimal mais tu peux en une requête récuperer l'ensemble de tes informations dans un tableau qui a pour clé la catégorie, puis le reparcourir categorie par categorie.
Un truc style
Code : Tout sélectionner
<?
$q = "SELECT * FROM matable WHERE val = '1'";
$mysql_result = execute_requete($q);
$TabInformations = array();
while($r = mysql_fetch_array($mysql_result)) {
$TabInformations[$r['cat']][] = $r;
}
//puis :
foreach($TabInformation['cat1'] as $TabResultSql){
$champ1= $TabResultSql['champ1'];
$champ2 = $TabResultSql['champ2'];
$AF.= "<table>
<tr>
<td>
$champ1<br>
$champ2</td>
</tr>
</table>\n";
}
?>
C'est surement pas le top du top mais ca evitera de faire plusieurs requêtes. Sachant que tu ne gagne pas forcément du temps à executer 4 petites requêtes qu'une grosse.
Evite aussi le "*", précise les champs et pense aux index sur ta table.
Bon courage

Posté : 13 mars 2007, 16:19
par dogmongo
je test ca tout de suite

Posté : 13 mars 2007, 16:30
par dogmongo
humm il y a une error quelque par ca nbe fonctionne pas ?
Posté : 13 mars 2007, 16:47
par jobi1722
C'est quoi l'erreur ?
Posté : 13 mars 2007, 16:48
par jobi1722
J'ai oublié un 's' à $TabInformation hihi (dans le foreach)
Posté : 13 mars 2007, 16:49
par dogmongo
aucune idée rien ne s'affiche
Posté : 13 mars 2007, 16:58
par titerm
J'essairai bien qq chose du genre
SELECT champ1,champ2l FROM matable WHERE val='1' group by cat,champ1,champ2
Posté : 13 mars 2007, 17:05
par dogmongo
Moi je serai bien tenté de faire un GROUP BY "cat"
mais comment rassembler les résultats
Peu être avec un ORDER BY "cat"
$query = "SELECT count(ID),cat1,cat2,cat3,cat4,cat5 FROM matable GROUP BY cat ORDER BY cat DESC";
tu vois ce que je veux dire ?
Posté : 13 mars 2007, 17:58
par titerm
Je suis pas un pro mysql, mais le group by sous oracle, tu doit obligatoirement avoir au moins la liste des champs que tu select. Dans ton cas, le select count,cat1 etc... il faut reprendre ta liste... Tu peux effectivement faire un order by derrière...
Ce que je comprend moins, c'est que dans ta premiere requete tu faisais un select cat et tu avais une clause where pour selectionner cat1.... Now, tu fais un select cat1 ....
Ca serait bien de donner le schemas exacte de la table....
Posté : 13 mars 2007, 18:00
par dogmongo
La clause WHERE est juste un champs de validation admin 1 ou 0
Posté : 14 mars 2007, 14:18
par dogmongo
Je viens de percuter un truc
imaginons je fais ma requete avec un ORDER BY cat
pensez vous que je puisse générer un echo "<br>"; chaque fois que le champs cat change ?
en gros
cat1 cat1 cat1 etc..
si changement de critère du champs cat1
on force un retour à la ligne
echo "<br>";
cat2 cat2 cat2
etc..
maintenant comment le faire réagire dans mon while chaque fois que le champs cat change ?
j'apporche du but , ce truc est important il me ferai économiser des centaines de requetes

Posté : 14 mars 2007, 14:42
par raptor
ben
$cat0 = "";
while [......] {
if ($res["cat"]!=$cat0) {
echo "<br />";
$cat0 = $res["cat"];
}
[traitement de ta boucle]
}
Ceci est un exemple à adapter hein

Posté : 17 mars 2007, 20:00
par dogmongo
bon bein il semble que je ne résoufrais pas mon problème

Posté : 19 mars 2007, 06:55
par ghalaad
oui tu peux le faire avec des UNION.
Dans ce cas là tu auras l'ensemble des résultats de tes requêtes les uns à la suite des autres:
$nb_cat = 5;
for($i=0;$i<$nb_cat;$i++)
{
$q = "SELECT * FROM matable WHERE cat='cat".$i+1."' and val='1' UNION "; // $i+1 puisque cat va de 1 à 5 et la boucle de 0 à 4.
}
$q = substr($q,0,-6); // pour virer le dernier "UNION " en trop.
Tu auras alors :