Page 1 sur 1

jointure deficiente

Posté : 08 mars 2006, 12:25
par fila
Salut !
J'ai un peu de mal avec les jointures:
Voici ma requete de table pour afficher les fonctions et leurs types :

Code : Tout sélectionner

$query1= "SELECT f.id_fonction, f.fonction,f.id_type, t.id_type, t.type FROM fonction f, type t WHERE f.id_type = t.id_type "; $resul = mysql_query($query1) or die ("Requete '$query1' impossible"); if(mysql_num_rows($resul)==0){ print"<h2>Aucune fonction dans la base\n</h2>";
}.......Il y a des fonctions dans la table et cela me renvoie "aucune fonction..."
Ceci c'est la requete de formulaire :

Code : Tout sélectionner

$query1= "SELECT f.id_fonction, f.fonction, f.id_type, t.id_type, t.type FROM fonction f, type t WHERE f.id_type = t.id_type "; En fait je veux afficher le type donc dans mon form je fais cela : <select name="id_type" > <?php $query = " SELECT id_type, type FROM type order by type "; $resul = mysql_query($query) or die ("Requete '$query' pas possible"); while($row = mysql_fetch_array($resul)) { print"<option value=".$row[id_type].">".$row[type]."</option>"; }?> </select>
si je fais une requete toute simple style "select* from fonction order by id_fonction";
Bon la cela marche. Cela deco...a partir du moment ou je mets en place $query1 !
Je vous remercie par avance[/code]

Posté : 08 mars 2006, 12:37
par heddicmi
1èrement, quand tu donnes un nom à table dans une requête, il faut utiliser AS...

exmple :

Code : Tout sélectionner

SELECT * FROM table [b]AS[/b] t

Posté : 08 mars 2006, 12:48
par Ryle
1èrement, quand tu donnes un nom à table dans une requête, il faut utiliser AS...
Ce n'est pas utile pour le nom des tables, l'alias se fait très bien sans. C'est nécessaire en revanche pour le nom des champs. :)

La syntaxe de ta requête est bonne, tu dois d'ailleurs pouvoir la tester avec phpMyAdmin pour la vérifier. En revanche, pour qu'elle te ramene des résultat, cela implique qu'il doit forcément y avoir un id_type dans la table type associé à ta fonction. S'il n'y en a pas, c'est qu'aucune fonction ne répond à ta condition et donc pas de résultat.

Si tu veux ramener des lignes, même lorsqu'il n'y a pas de correspondance dans type, il faut utiliser une jointure externe :
$query1= "SELECT f.id_fonction, f.fonction, f.id_type, t.id_type, t.type ";
$query1.= "FROM fonction f LEFT OUTER JOIN type t ON f.id_type = t.id_type "; 
(Nota : f.id_type et t.id_type te retourneront le même résultat vu ta condition, ce n'est donc pas utile de ramener les deux :))

Posté : 08 mars 2006, 12:51
par heddicmi
1èrement, quand tu donnes un nom à table dans une requête, il faut utiliser AS...
Ce n'est pas utile pour le nom des tables, l'alias se fait très bien sans. C'est nécessaire en revanche pour le nom des champs. :)
Ouaip me suis fais eu sur ce coup ! C'est mon côté psycho rigide je pense :roll:

jointure

Posté : 08 mars 2006, 13:00
par fila
Merci cela marche....Mais il y a encore un pb :
Dans la table je n'arrive pas a afficher le type:
pourtant cela me semble bon :

Code : Tout sélectionner

print"<td>".$row["type"]."</td>";
en tout cas merci pour les explications

Posté : 08 mars 2006, 14:37
par fila
ca y est c'est resolu merci a tous ! :lol: