[Resolu] Optimisation de requetes PHP

Mammouth du PHP | 804 Messages

13 mars 2007, 14:28

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 :)
Modifié en dernier par dogmongo le 24 mars 2007, 19:45, modifié 2 fois.

Eléphant du PHP | 82 Messages

13 mars 2007, 16:17

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 :)
Modifié en dernier par jobi1722 le 13 mars 2007, 16:48, modifié 1 fois.

Mammouth du PHP | 804 Messages

13 mars 2007, 16:19

je test ca tout de suite ;)

Mammouth du PHP | 804 Messages

13 mars 2007, 16:30

humm il y a une error quelque par ca nbe fonctionne pas ?

Eléphant du PHP | 82 Messages

13 mars 2007, 16:47

C'est quoi l'erreur ?

Eléphant du PHP | 82 Messages

13 mars 2007, 16:48

J'ai oublié un 's' à $TabInformation hihi (dans le foreach)

Mammouth du PHP | 804 Messages

13 mars 2007, 16:49

aucune idée rien ne s'affiche

Mammouth du PHP | 505 Messages

13 mars 2007, 16:58

J'essairai bien qq chose du genre

SELECT champ1,champ2l FROM matable WHERE val='1' group by cat,champ1,champ2

Mammouth du PHP | 804 Messages

13 mars 2007, 17:05

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 ?

Mammouth du PHP | 505 Messages

13 mars 2007, 17:58

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

Mammouth du PHP | 804 Messages

13 mars 2007, 18:00

La clause WHERE est juste un champs de validation admin 1 ou 0

Mammouth du PHP | 804 Messages

14 mars 2007, 14:18

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 :idea:

Mammouth du PHP | 543 Messages

14 mars 2007, 14:42

ben
$cat0 = "";
while [......] {
  if ($res["cat"]!=$cat0) {
    echo "<br />";
    $cat0 = $res["cat"];
  }
  [traitement de ta boucle]
}
Ceci est un exemple à adapter hein ;)

Mammouth du PHP | 804 Messages

17 mars 2007, 20:00

bon bein il semble que je ne résoufrais pas mon problème :(

Eléphanteau du PHP | 49 Messages

19 mars 2007, 06:55

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 :