8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

voila depuis un petit moment, je planche sur ma requête sur plusieurs tables... en faite je voudrais mettre sur la première page de mon site, les 5 dernières news posté, les cinq dernière fiches de films et idem pour les jeux, le tout dans un même tableau.

Donc j'arrive bien à afficher les 5 dernières news dans mon tableau, ou encore les 5 dernières fiches de jeux ou encore de films MAIS pas les trois

Smiley fache


Et donc ma demande est la, comment faire une requête sur trois table ??
Je vous post ci dessous mes différents essai..


<?php

					require("connexBDD.php"); 
					mysql_connect($host, $username, $password);
					mysql_select_db($bdd_name);
?>

<?php
				$retour = mysql_query('SELECT * FROM News ORDER BY id_News  DESC LIMIT 0, 5'); 			
?>
<table><tr>
<th>Les dernières news</th>
<th>Les derniers films</th>
<th>Les derniers jeux</th>
</tr>
<?php 
while ($donnees = mysql_fetch_array($retour) )
{
?>

<tr>
<td><?php echo '<a href="kernel.php?page=news_detail&id=' . $donnees['id_News'] . '"> ' . $donnees['titre_News'] . '</a>'; ?></td>
<td><?php echo '<a hre="kernel.php?page=films_detail&id=' . $donnees['id_Films'] . '"> ' . $donnees['titre_Films'] . '</a>'; ?></td>
<td><?php echo '<a hre="kernel.php?page=jeux_detail&id=' . $donnees['id_Jeux'] . '"> ' . $donnees['titre_Jeux'] . '</a>'; ?></td>
</tr>

<?php
}
mysql_close();
?></table>


Ce code, comme vous vous en doutez affiche seulement les news dans le tableau Smiley smile , forcement une requête sur une table donc c'est logique ...

Sans me débiner je tente une requête sur trois table, soyons fou Smiley ravi ..
J'up donc sa sur mon FTP :


<?php

					require("connexBDD.php"); 
					mysql_connect($host, $username, $password);
					mysql_select_db($bdd_name);
?>

<?php
				$retour = mysql_query('SELECT * FROM News, Films, Jeux ORDER BY id_News, id_Films, id_Jeux DESC LIMIT 0, 5'); 			
?>
<table><tr>
<th>Les dernières news</th>
<th>Les derniers films</th>
<th>Les derniers jeux</th>
</tr>
<?php 
while ($donnees = mysql_fetch_array($retour) )
{
?>

<tr>
<td><?php echo '<a href="kernel.php?page=news_detail&id=' . $donnees['id_News'] . '"> ' . $donnees['titre_News'] . '</a>'; ?></td>
<td><?php echo '<a hre="kernel.php?page=films_detail&id=' . $donnees['id_Films'] . '"> ' . $donnees['titre_Films'] . '</a>'; ?></td>
<td><?php echo '<a hre="kernel.php?page=jeux_detail&id=' . $donnees['id_Jeux'] . '"> ' . $donnees['titre_Jeux'] . '</a>'; ?></td>
</tr>

<?php
}
mysql_close();
?></table>


Bien tenté ?! Nan je ne pense pas vu le resultat.... La requete ne fonctionne pas et tout part en travers sur le tableau de l'accueil ...

D'autres tentatives m'on était infructueuse ...

J'ai donc essayer encore plusieurs type de requête avec des AS et des alias, j'ai lut la doc sur les jointures, mais je ne parvient toujours pas à mes fins, vôtre aide serait la bienvenue ^^

Merci à tous de me lire ..
Modifié par immat (11 Jul 2007 - 22:52)
Salut immat Smiley cligne ,

Y a comme qui dirait une confusion Smiley murf : quand on veut lire plusieurs tables d'un coup par le biais d'une jointure c'est justement parce qu'il existe une jointure entre les tables Smiley lol ...

Exemple type :

Table entetes_commandes (id_commande / date_commande / nom_client / etc...)

Table lignes_commandes (id_commande / numero_ligne / id_article / etc...)


La jointure se fait toujours sur un (ou des) champ(s) en commun : ici c'est id_commande. On ferait par exemple :
Select * from entetes_commandes as e, lignes_commandes as l where e.id_commande = l.id_commande order by date_commande DESC


Donc dans ton cas, puisqu'aucun champ commun ne relie les tables, il faut faire 3 requêtes distinctes...

Voici un exemple avec mysql_fetch_assoc :
<?PHP
require("connexBDD.php"); 
mysql_connect($host, $username, $password);
mysql_select_db($bdd_name);
?>
<table>
<tr>
<th>Les dernières news</th>
<th>Les derniers films</th>
<th>Les derniers jeux</th>
</tr>
<?php 
$ligne = array();

$sql = mysql_query('SELECT id_News, titre_News FROM News order by id_News DESC LIMIT 0, 5'); 			
While( $enregistrement = mysql_fetch_assoc( $sql ) )
{
  foreach( $enregistrement as $champ => $valeur ) 
  {
    if( ! isset( $ligne[ $champ ] ) ) $ligne[ $champ ] = array();
    $ligne[ $champ ][] = $valeur;
  }
}

$sql = mysql_query('SELECT id_Films, titre_Films FROM Films order by id_Films DESC LIMIT 0, 5'); 			
While( $enregistrement = mysql_fetch_assoc( $sql ) )
{
  foreach( $enregistrement as $champ => $valeur ) 
  {
    if( ! isset( $ligne[ $champ ] ) ) $ligne[ $champ ] = array();
    $ligne[ $champ ][] = $valeur;
  }
}

$sql = mysql_query('SELECT id_Jeux, titre_Jeux FROM Jeux order by id_Jeux DESC LIMIT 0, 5'); 			
While( $enregistrement = mysql_fetch_assoc( $sql ) )
{
  foreach( $enregistrement as $champ => $valeur ) 
  {
    if( ! isset( $ligne[ $champ ] ) ) $ligne[ $champ ] = array();
    $ligne[ $champ ][] = $valeur;
  }
}

// Affichage
for ($i = 0 ; $i < 5; $i++) {
?>
<tr>
<td><?php echo '<a href="kernel.php?page=news_detail&id=' . $ligne['id_News'] [$i]. '"> ' . $ligne['titre_News'] [$i]. '</a>'; ?></td>
<td><?php echo '<a href="kernel.php?page=films_detail&id=' . $ligne['id_Films'] [$i]. '"> ' . $ligne['titre_Films'] [$i]. '</a>'; ?></td>
<td><?php echo '<a href="kernel.php?page=jeux_detail&id=' . $ligne['id_Jeux'] [$i]. '"> ' . $ligne['titre_Jeux'] [$i]. '</a>'; ?></td>
</tr>
<?php
}
mysql_close();
?>
</table>


A+ Smiley smile
Bonjour,

Au pire il pourrai faire une autre table qui regroupe les dernier ajout et faire appele a cette table Smiley lol .

Comme cela sa bdd serai au moins dans les normes Smiley cligne
Salut,

Une autre solution consisterait à utiliser la clause UNION. Cette clause permet de regrouper les données de plusieurs tables en une seule requete. Cependant, il est impératif que les champs sélectionnés dans les différentes tables soient de même type (à position identique). Par exemple :

 select colA1, colB1 from tab1 union select colA2, colB2 from tab2

Il faut donc que colA1 et colA2 soient de même type et que colB1 et colB2 soient de même type.

Pour ton cas, on peut imaginer la requête suivante:

( SELECT id_News AS id, titre_News AS titre FROM News order by id_News DESC LIMIT 0, 5 )
   UNION
( SELECT id_Films, titre_Films FROM Films order by id_Films DESC LIMIT 0, 5 )
   UNION
( SELECT id_Jeux, titre_Jeux FROM Jeux order by id_Jeux DESC LIMIT 0, 5 )


Les alias id et titre placés sur les champs de la première requête permettent de regrouper les résultats des 3 requêtes sous les mêmes noms de colonnes.

J'éspère que cela t'aidera Smiley cligne