Requette SQL sur 3 tables

NoOneII
Invité n'ayant pas de compte PHPfrance

09 juil. 2005, 14:57

Bonjour,

J'ai les 3 tables suivantes :

TABLE categorie
idcat mediumint(9) auto_increment
nomcat varchar(20)

TABLE scategorie
idscat mediumint(9) auto_increment
liencat mediumint(9)
nomscat varchar(100)

TABLE sscategorie
idsscat mediumint(9) auto_increment
lienscat mediumint(9)
nomsscat varchar(100)

qui me permettent de stocker un menu avec catégorie, sous catégorie et sous-sous catégorie

Quand j'affiche mon menu je faire 3 requettes du type
$query="SELECT .... INTO categorie";
while()
{
$query="SELECT .... INTO scategorie WHERE liencat=idcat";
        while()
        {
        $query="SELECT .... INTO sscategorie WHERE lienscat=idscat";
        }
}
Je suppose qu'il est possible de simplifer mon usine à Gaz, voir même de faire une seul requette ? mais je ne vois pas comment.
Pourriez vous m'aider
Merci d'avance.

Mammouth du PHP | 19672 Messages

09 juil. 2005, 15:04

Dans un premier temps, ce n'est pas SELECT ... INTO, mais SELECT ... FROM

Ensuite effectivement, tu peux simplifier:

Code : Tout sélectionner

SELECT ... FROM cetagorie, scategorie, sscategorie WHERE lienscat = idscat AND liencat = idcat;
Mais il manque les champs dans ton select. Précise ce que tu veux obtenir.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

09 juil. 2005, 20:34

il faut simplement faire une jointure.

http://www.commentcamarche.net/sql/sqljoint.php3

NoOneII
Invité n'ayant pas de compte PHPfrance

10 juil. 2005, 18:40

Voilà le code complet de la création de mon menu que je voudrais remplacer par une seul ligne de requette si la chose est possible
<?php
include ("connexion.php");

$query="SELECT idcat,nomcat FROM categorie ORDER BY nomcat";
$result=MYSQL_QUERY($query);

while($row=MYSQL_FETCH_ARRAY($result))
{
   echo $row['nomcat']."<br>";

   $query2="SELECT idscat,liencat,nomscat FROM scategorie WHERE liencat=".$row['idcat']." ORDER BY nomscat";
   $result2=MYSQL_QUERY($query2);
   while($row2=MYSQL_FETCH_ARRAY($result2))
   {
      echo "--".$row2['nomscat']."<br>";
      $query3="SELECT idsscat,lienscat,nomsscat FROM sscategorie WHERE lienscat=".$row2['idscat']." ORDER BY nomsscat";
	  $result3=MYSQL_QUERY($query3);
	  while($row3=MYSQL_FETCH_ARRAY($result3))
	  {
	  echo "-----".$row3['nomsscat']."<br>";
	  }
	}
}
MYSQL_CLOSE();
?>
le résultat donne :

CATEGORIE
--SOUS CATEGORIE
----SOUS SOUS CATEGORIE
CATEGORIE
--SOUSCATEGORIE
----SOUS SOUS CATEGORIE
----SOUS SOUS CATEGORIE
etc.....

Eléphant du PHP | 91 Messages

11 juil. 2005, 18:15

Salut,

le SQL est un langage ensembliste. Il est trés puissant pour manipuler des ensemble de données homogéne. Cependant il posséde des points faibles :
=> requête itérative de pronfondeur inconnue.
=> requête de reporting complexe : C'est pil poil ton cas ici. Le plus simple est donc de garder ta solution PHP qui est la plus simple.

(Il existe une solution en passant par de table temporaire avec un curseur ... mais ta solution sera plus simple, donc garde la)

PS : Quand je donne une formation pour expliquer ces limites il me faut 30 mn. Je suis pas suffisament motivé pour t'écrire le pourquoi du comment.

Invité
Invité n'ayant pas de compte PHPfrance

11 juil. 2005, 20:48

Salut,
PS : Quand je donne une formation pour expliquer ces limites il me faut 30 mn. Je suis pas suffisament motivé pour t'écrire le pourquoi du comment.
OK, merci pour ta réponse qui me suffit. Et de toute façon je ne voyais pas par quel miracle je pouvais faire autrement de façon simple.

Mammouth du PHP | 543 Messages

13 juil. 2005, 14:22

Dans son cas, la profondeur est connue, et limitée a 3.

je pense qu'il peut eventuellement essayer de passer par des variables dynamiques et des tableaux.