Page 1 sur 1

Simplification de ma requête MySQL

Posté : 24 janv. 2006, 19:54
par netcodeur
Bonjour. Je bute actuellement face à une requête MySQL.

Je dispose de 2 tables : CATEGORIE et SITE.

En simplifiant on a le MLD suivant :

- CATEGORIE (num_cat, nom_cat)
- SITE (num_site, nom_site, #num_cat)

Je souhaiterai faire apparaitre ceci :
{nom_cat1}
------------------------------
- {nom_site1}
- {nom_site2}

{nom_cat2}
------------------------------
- {nom_site3}
- {nom_site4}
Vous voyez le genre ?

Actuellement j'ai pensé faire la requête suivante avec une jointure entre les 2 tables :
$sql="select * from categorie,site ";
$sql.="where categorie.num_cat=site.num_cat";
$req=mysql_query($sql);
while($tabres=mysql_fetch_array($req))
{
	echo"<h2>".$tabres["nom_cat"]."</h2>";
	echo"<ul>";
	echo"<li>".$tabres["nom_site"]."</li>";
	echo"</ul>";
}
Mais il y a un hic. Cela m'affiche en sortie ceci :
{nom_cat1}
------------------------------
- {nom_site1}

{nom_cat1}
------------------------------
- {nom_site2}

{nom_cat2}
------------------------------
- {nom_site3}
J'ai donc modifier cette requête mais je pense qu'il en existe une beaucoup plus simple que

celle-ci mais laquelle :
$sql="select * from categorie";
$req=mysql_query($sql);
while($tabres=mysql_fetch_array($req))
{
        $num_cat = $tabres["num_cat"];
        $nom_cat = $tabres["nom_cat"];
        
        echo"<h2>".$nom_cat."</h2><ul>";

        $sql2="select * from site where num_cat=$num_cat";
        $req2=mysql_query($sql2);
        while($tabres2=mysql_fetch_array($req2))
                echo"<li>".$tabres2["nom_site"]."</li>";

 	echo"</ul>";
}

Merci de votre aide.

Posté : 24 janv. 2006, 21:48
par Cyrano
La première formule avait plus d'allure mais dans les deux cas de toutes façon incomplet au niveau SQL et un peu trop simpliste au niveau PHP. Proposition:
<?php
$sql  = "SELECT nom_cat, nom_site ".
        "FROM categorie AS c, site AS s ".
        "WHERE c.num_cat = s.num_cat ".
        "ORDER BY num_site, c.num_cat";
$req = mysql_query($sql);
/* On compte les résultats */
$nb_sites = mysql_num_rows($req);
if($nb_sites > 0)
{
    /* Pointeur de catégorie */
    $cs = "";
    while($tabres = mysql_fetch_array($req))
    {
        if($tabres['nom_cat'] != $cs)
        {
            if(!empty($cs))
            {
                echo"</ul>";
            }
            echo"<h2>". $tabres['nom_cat'] ."</h2>";
            echo"<ul>";
            $cs = $tabres['nom_cat'];
        }
        echo"<li>".$tabres['nom_site']."</li>";
    }
    echo"</ul>";
}
?>
Essaye comme ça et reviens si tu ne comprends pas quelque chose;

Réponse

Posté : 24 janv. 2006, 21:58
par c2pk
Merci pour ton effort de réponse.

Cependant je reviens vers toi car je n'ai pas saisi l'utilité des lignes citées ci dessous (en particulier le rôle de la variable $cs) :
 
        if($tabres['nom_cat'] != $cs)
        {
            if(!empty($cs))
            {
                echo"</ul>"; 
            }
            echo"<h2>". $tabres['nom_cat'] ."</h2>";
            echo"<ul>";
            $cs = $tabres['nom_cat'];
        }
        echo"<li>".$tabres['nom_site']."</li>";
    }
    echo"</ul>";
}
?>

Posté : 24 janv. 2006, 22:01
par Cyrano
As-tu testé ce code dans un premier temps ?