Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete MySql dans boucles While

4 réponses
Avatar
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...)

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.

4 réponses

Avatar
Christophe Meresse
On 28 fév, 23:51, "BZP" wrote:
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]


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

Avatar
CrazyCat
BZP wrote:
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

Avatar
Thief13
hAlala, les ravages du copier coller !

errata :

ce serait vachement plus simple, car la requette ressemblerait à ça :

SELECT nomcategorie, idcategorie, nomforum, idforum, nomsujet, idsujet
FROM categories
NATURAL JOIN forums
NATURAL JOIN sujets


et non pas à :

SELECT nomcategorie, idcategorie, nomforum, idforum, nomsujet, idsujet
FROM categories
INNER JOIN forums
INNER JOIN sujets


Avatar
Thief13
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,
corrigé :

Voici (à mon sens) la meilleur solution pour ton cas, en une seul requette :

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 ?

Par contre, si tu construisais tes tables comme ça :

categories :
_idcategorie
nomcategorie

forums :
_idforum
nomforum
idcategorie

sujets :
_idsujet
nomsujet
idforum


ce serait vachement plus simple, car la requette ressemblerait à ça :

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