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 ) ;
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
On 28 fév, 23:51, "BZP" <p.audon...@gmail.com> 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.
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
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";
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
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";
(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...
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 :
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...
(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...