[Resolu] Optimisation de requetes PHP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Resolu] Optimisation de requetes PHP

par Invité » 24 mars 2007, 16:46

jobi1722 tu étais le plus proche de la solution !

je viens de prendre un choc en testant ca correctement

ca marche impeccablement et ca va très très vite :) 1 requete au lieu de 5 lourde oua :)

Pour count() oder by c'est interessant mais ca nécessite 2 requetes au lieu de 1 puisque order me limitait à un champs en sorti et par cat
(j'avais déjà essayé)

Je dépose ma solution bien que j'ai honte tant c'étais simple et que j'ai cherché à me rendre la tache dificile !
<?php

//je me connect à ma base et class dans l'ordre (champs [ordre])
$q = "SELECT * FROM catalogue ORDER BY ordre DESC";
$ql= execute_requete($q);

while($r = mysql_fetch_array($ql)) 
{
 	   //récupération des champs
                   $cat= $r['cat'];
                   $list[$r['cat'] ] []  = $row['produit'];
} 

foreach ( $list as $cat => $produit )

// je liste mes produits par catégorie du champs(cat) de chaque produit
// je rapelle qu'il y a 5 catégories de prévue dans ma base les produits y sont dipatcher.

{

//un espace entre les 5 listes de produits
        echo "Catégorie $cat :<br/>";

// Pour chaque catégorie j'affiche mes produits 
       
        foreach ( $produit as $produit)
        
       {

//j'affiche mes produits 
               
echo "$produit<br>";
       
       }


}
?>
Merci à tous je file modifier mon poste en [résolu]

par ghalaad » 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 :

par dogmongo » 17 mars 2007, 20:00

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

par raptor » 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 ;)

par dogmongo » 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:

par dogmongo » 13 mars 2007, 18:00

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

par titerm » 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....

par dogmongo » 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 ?

par titerm » 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

par dogmongo » 13 mars 2007, 16:49

aucune idée rien ne s'affiche

par jobi1722 » 13 mars 2007, 16:48

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

par jobi1722 » 13 mars 2007, 16:47

C'est quoi l'erreur ?

par dogmongo » 13 mars 2007, 16:30

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

par dogmongo » 13 mars 2007, 16:19

je test ca tout de suite ;)

par jobi1722 » 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 :)