Discussion:
Requete MySql dans boucles While
(trop ancien pour répondre)
BZP
2007-02-28 22:51:18 UTC
Permalink
Bonjour,

Je voulais connaitre votre avis en ce qui concerne ce code.
Il contient des requetes MySql (non persistante) dans des boucles.
Quels sont les pour et les contre (arguments à l'appuis, mémoire,
threads...)

Contexte : un serveur MySql 4 (en mode MYISAM), PHP 4 (en mode MODULE)

MCD : Une table Catégorie, qui a un Nom et un Id (Clé Prim)
Une table Forum qui a un nom une desc un Id (clé Prim) et une clé
etrangere IdCatégorie
Une table Sujet qui a un nom un id (clé Prim) et une clé etrangere
IdForum

<?php

// On liste les catégorie
$sql_0 = "SELECT nom, id FROM categorie"
$exe_0 = mysql_query( $sql ) ;
while( $element_0 = mysql_fetch_objet( $exe_0 ) )
{

// On liste les forums pour la catégorie courante
$sql_1 = "SELECT nom, id FROM forum WHERE id_categorie = ".
$element_0->id ;
$exe_1 = mysql_query( $sql_1 ) ;
// On affiche le nom de la catégorie courante ainsi que le
nombre de forums qu'elle contient
echo "Catégorie : ". $element_0->nom ." (".
mysql_num_rows( $exe_1 ) ." forums)<br>\n" ;

while( $element_1 = mysql_fetch_objet( $exe_1 ) )
{
// On liste les sujets du forum courant
$sql_2 = "SELECT nom, id FROM sujets WHERE id_forum ". $element_1->id ;
$exe_2 = mysql_query( $sql_2 ) ;

echo $element_1->nom ." (".
mysql_num_rows( $exe_2 ) ." sujets)<br>\n" ;
// On affiche les sujets
while( $element_2 = mysql_fetch_objet( $exe_2 ) )
echo $element_2->nom ."<br>\n" ;
}
}
?>

Merci de vos avis.
Christophe Meresse
2007-03-01 11:52:04 UTC
Permalink
Post by BZP
Bonjour,
Je voulais connaitre votre avis en ce qui concerne ce code.
Il contient des requetes MySql (non persistante) dans des boucles.
Quels sont les pour et les contre (arguments à l'appuis, mémoire,
threads...)
[snip]
Post by BZP
Merci de vos avis.
Ca va marcher mais ça risque d'être très lent.
Utilise des jointures, tout peut être fait en une seule requête SQL.

SELECT categorie.nom AS nom_cat, forum.nom AS nom_forum, sujets.nom AS
nom_sujet FROM categorie,forum,sujets WHERE sujets.id_forum=forum.id
AND forum.id_categorie=categorie.id ORDER BY categorie.nom, forum.nom,
sujet.nom

(requete pas testée)

Regarde du coté des jointures mySQL <http://dev.mysql.com/doc/refman/
5.0/fr/join.html> parce que là j'ai fais sans et c'est peut-être pas
le mieux (J'ai toujours du mal avec ces INNER, OUTER, LEFT, RIGHT, (+)
d'un coté ou de l'autre pour oracle..., je dois toujours regarder la
doc...).

Ensuite tu fais une boucle sur tous les résultats et si le champ
nom_cat est différent du précedent, tu affiche l'entête de la
catégorie. Pareil pour le nom_forum.

Christophe
CrazyCat
2007-03-01 11:52:04 UTC
Permalink
Post by BZP
Je voulais connaitre votre avis en ce qui concerne ce code.
Il contient des requetes MySql (non persistante) dans des boucles.
Quels sont les pour et les contre (arguments à l'appuis, mémoire,
threads...)
Un avis sans trop d'arguments techniques: tu risques de saturer le
nombre de requètes simultanées et je pense que le traitement du résultat
d'une seule grosse requète par PHP sera un peu plus optimisée.

$sql = "SELECT c.nom AS cat_name, f.nom AS forum_name, s.nom AS
sujet_name FROM categorie c LEFT JOIN forum f ON f.id_categorie=c.id
LEFT JOIN sujet s ON s.forum_id=f.id GROUP BY c.id";
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
Thief13
2007-03-02 01:02:05 UTC
Permalink
hAlala, les ravages du copier coller !
SELECT nomcategorie, idcategorie, nomforum, idforum, nomsujet, idsujet
FROM categories
NATURAL JOIN forums
NATURAL JOIN sujets
SELECT nomcategorie, idcategorie, nomforum, idforum, nomsujet, idsujet
FROM categories
INNER JOIN forums
INNER JOIN sujets
Thief13
2007-03-03 00:35:20 UTC
Permalink
Bon, pour une raison que je ne connais pas, ma réponse n'a pas été
publié, mais l'errata à ma réponse si... donc, je repoubli ma réponse,
SELECT c.nom AS nom_cat, c.id AS id_cat, f.nom AS nom_for, f.id AS
id_for, s.nom AS nom_suj, s.id AS id_suj
FROM categorie c
FULL OUTER JOIN forum f
ON c.id = f.id_categorie
FULL OUTER JOIN sujets s
ON f.id = s.id_forum
Pourquoi tu met un s à la fin de sujets, mais pas à la fin de categorie,
ni de forum ?
_idcategorie
nomcategorie
_idforum
nomforum
idcategorie
_idsujet
nomsujet
idforum
SELECT nomcategorie, idcategorie, nomforum, idforum, nomsujet, idsujet
FROM categories
NATURAL JOIN forums
NATURAL JOIN sujets
Et pour finir, voici un site tres interressant pour parfaire tes
connaissances du SQL :
http://sqlpro.developpez.com/
et plus particulièrement, des jointures :
http://sqlpro.developpez.com/cours/sqlaz/jointures/

(PS : pour Olivier, désolé, mais je revien à mon nospam.com, car
nospam.invalid ne passe pas à l'envoi : "domaine non trouvé". il me
semble bien que j'avais déjà essayé de mettre un truc qui n'existait pas...
Continuer la lecture sur narkive:
Loading...