Regroupement d'enregistrements issus de tables jointes

Eléphant du PHP | 94 Messages

26 mai 2006, 08:11

Bonjour

J'ai un souci avec l'affichage d'enregistrements qui sont issus d'une table avec jointure.

J'ai une table avec mes articles et une table pour les rubriques ou les articles apparaitront (un article pouvant figurer dans plusieurs rubriques).

Pour restituer les articles je fais la requete suivante :
	$requete = "SELECT filinfo.id, filinfo.texte, DATE_FORMAT(dcrea, '[%d/%m - %H:%i]') AS 'dcreation', refinfo.ref, refinfo.idinf"
		. " FROM filinfo, refinfo"
		. " WHERE filinfo.id= refinfo.idinf" 
		. " AND refinfo.ref= '$i'" 
		. " ORDER BY dcrea DESC";
Cependant, si un article est dans 2 rubriques, j'obtiens 2 lignes (une ligne par rubrique).

Comment faire pour avoir une seule ligne par article et afficher dans cette ligne les rubriques dans lesquelles les articles figurent ?

J'ai 3 rubriques, je voudrais donc faire un tableau avec 3 colonnes par articles (avec oui / non) selon si l'article y figure ou pas
rspir

Eléphant du PHP | 94 Messages

26 mai 2006, 15:22

Faut il dissocier les requetes ? et ne pas essayer de tout faire dans une ?

C'est à dire lister d'abord les news puis à partir de l'id de chaque news lancer une seconde requete qui listerait les rubriques.

Je sèche un peu.

Euh d'ailleurs ... , suis je dans le bon forum ou faut il que je poste ce topic dans la rubrique mysql ?
rspir

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mai 2006, 15:40

non, tu es dans le bon forum ;)

Effectivement, tu ne peut pas faire ce que tu demande en une seule requete :(

Il faut que tu récupères les rubriques, et pour chaque rubrique, que tu récupére les articles qui lui sont associés.

Mais je me demande un truc. Comment une rubrique peut être associée à plusieurs articles et un articles peut-il être associé à plusieurs rubrique avec seulement 2 tables :-k
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 mai 2006, 16:00

En fait tu dois pouvoir le faire dans la mesure où tu as un nombre limité de rubriques, il te faudrait interroger 3 fois ta table avec des "outer join", mais je doute que ce soit ce qu'il y a de plus simple et de plus performant...

Eléphant du PHP | 94 Messages

26 mai 2006, 16:12

non, tu es dans le bon forum ;)

Effectivement, tu ne peut pas faire ce que tu demande en une seule requete :(

Il faut que tu récupères les rubriques, et pour chaque rubrique, que tu récupére les articles qui lui sont associés.

Mais je me demande un truc. Comment une rubrique peut être associée à plusieurs articles et un articles peut-il être associé à plusieurs rubrique avec seulement 2 tables :-k
Euh ... j'étais peut être pas clair : en fait un article peut être dans plusieurs rubriques.

Donc j'ai une table article et une table article / rubrique.
Pour être complet il faudrait compléter avec une table rubrique. Mais elle ne servirait à rien : je gère cela en affichage dans mon intranet

Bon pour en revenir au débat, il faut :
1 . que je liste mes articles
2. que je fasse une requete qui stocke dans un array les rubriques (1 à 3) de chaque article.

Reste à trouver comment restituer tout cela dans un tableau simple ...
rspir

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mai 2006, 16:34

Ton tableau, c'est un tableau HTML ou un tableau PHP ?

La méthodologie, c'est :

Code : Tout sélectionner

sélectionner les articles. Pour chaque article Afficher l'article selectionner les rubriques de l'article Pour chaque rubrique Afficher la rubrique Fin pour Finpour
Il ne te reste plus qu'a traduire ça en PHP ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 94 Messages

27 mai 2006, 10:06

ok merci avec tes conseils, j'arrive bien à faire l'affichage
Mon code devient dense :
<?php
include("commun/menadm.htm");
include("commun/header_adm.htm");

echo "<div id='accueil_s'>";

	$requete = "SELECT filinfo.id, filinfo.dcrea, filinfo.texte, DATE_FORMAT(filinfo.dcrea, '%d/%m/%y %H:%i') AS 'dcreation',DATE_FORMAT(filinfo.maj, '%d/%m/%y %H:%i') AS 'dmaj'"			   		 . " FROM filinfo"
			 . " ORDER BY dcrea DESC";
	
	$resultat = ExecRequete ($requete, $connexion);
	$num=mysql_num_rows ($resultat);
	
	if ($num < 1)
	{
		echo "Aucun <span class='i'>i-</span>communiqué trouvé<br>\n";
	}
	else
	{
		
		echo "<h1>" .$num. ($num ==1 ? ' <span class="i">i-</span>communiqué trouvé' : ' <span class="i">i-</span>communiqués trouvés') ."</h1>"
		. "<table border=0 cellspacing=2 cellpadding=2>"
		. "<caption align=bottom>Gestion des <span class='i'>i-</span>communiqués</caption>"
		. "<tr class='titre'><th><span class='i'>i-</span>communiqué</th>"
		. "<th>référentiels</th>"
		. "<th>Modif.</th>"
		. "<th>Création</th>"
		. "<th colspan='4'>Action</tr>\n";
		
		$i=0;
		while ($info = ObjetSuivant($resultat))
		{
			$i++;
			$idURL=urlEncode ($info->id);
		?>
			<tr class="A<?php echo ($i%2);?>" onMouseOver="this.className='over'" onMouseOut="this.className='A<?php echo ($i%2);?>'">
			
				<td width=450><?php echo $info->texte;?></td>
				<td>
				<?php
					$requete2 ="SELECT refinfo.ref,refinfo.idinf"
		 					. " FROM refinfo"
							. " WHERE refinfo.idinf=$info->id"; 
					$resultat2 = ExecRequete ($requete2, $connexion);
					$num2=mysql_num_rows ($resultat2);
					while ($info2 = ObjetSuivant($resultat2))
					{
					echo  $info2->ref." " ;
					}				
				?>
</td>
				<td><?php echo $info->dcreation;?></td>
				<td><?php echo $info->dmaj;?></td>
				
				<td><a href="_admin.php"><img hspace="2" width="16" height="16" src="./images/b_props.png" alt="Publier" title="Publier" border='0'></a></td>
				<td><a href="_admin.php?mode=maj&id=<?php echo $idURL;?>"><img hspace="2" width="16" height="16" src="./images/b_edit.png" alt="Modifier" title="Modifier" border="0"></a></td>
				<td><a href="_admin.php?mode=archive&id=<?php echo $idURL;?>"><img hspace="2" width="16" height="16" src="./images/b_tblexport.png" alt="Archiver" title="Archiver" border='0'></a></td>
				<td><a href="_admin.php?mode=delete&id=<?php echo $idURL;?>"><img hspace="2" width="16" height="16" src="./images/b_drop.png" alt="Supprimer" title="Supprimer" border='0'></a></td>
			</tr>
		<?
			
		}
	
		echo "</table>\n";
	}
Peut être un peu lourd ... en tout cas à optimiser
Modifié en dernier par rspir le 27 mai 2006, 19:48, modifié 1 fois.
rspir

Eléphant du PHP | 94 Messages

27 mai 2006, 19:51

EDIT : C'est donc ok pour l'affichage des rubriques.
Avec le echo je récupère bien la ou les rubriques dans lequel l'article figure.

J'ai voulu adapter cette technique à un formulaire pour précocher des cases à cocher selon si l'article est dans une rubrique.

Que pensez vous de ce code ? Ca fonctionne mais peut être peut il être optimisé ou simplifié ?
$requete = "SELECT filinfo.id, texte"
				. " FROM filinfo"
//				. " LEFT JOIN refinfo ON filinfo.id = refinfo.idinf"
				. " WHERE filinfo.id='{$info['id']}'";
				
		
	$resultat = ExecRequete ($requete, $connexion);
?>
		<FORM ACTION="_admin.php" METHOD="POST">
		<input type=hidden name="action" value="assocref">
		<h1>
		Publication</h1>
		<hr>
		<p>Pour être publié et visibles des utilisateurs, les <span class='i'>i-</span>communiqués doivent être associé à un référentiel.
		<p>Le tableau ci-dessous permet de sélectionner le ou les référentiels ou les <span class='i'>i-</span>communiqués doivent figurer
		<p>Si aucun référentiel n'est sélectionné, le <span class='i'>i-</span>communiqué ne sera pas visible des CCD.
		<center><table border=0 cellspacing=2 cellpadding=2>
		<caption align=bottom>Publication des <span class='i'>i-</span>communiqués</caption>
		<tr class='titre'><th>id</th><th><span class='i'>i-</span>communiqué</th>
		<th>RAE</th>
		<th>RAS</th>
		<th>RAM</th>

	<?php	
		$i=0;
		while ($info = LigneSuivante($resultat))
		{
			$i++;
	
		?>		
			<tr class="A<?php echo ($i%2);?>" onMouseOver="this.className='over'" onMouseOut="this.className='A<?php echo ($i%2);?>'">
				<td><?php echo $info[id];?></td><input type=hidden name="id" value="<?php echo $info[id]; ?>">				
				<td width=450><?php echo $info[texte];?></td>
				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info[id]; ?>,'rae')"
				<?php
					$requete2 ="SELECT refinfo.ref,refinfo.idinf"
		 					. " FROM refinfo"
							. " WHERE refinfo.idinf=$info[id]"; 
					$resultat2 = ExecRequete ($requete2, $connexion);
					while ($info2 = LigneSuivante($resultat2))
					{
					if (ereg('rae', $info2[ref]))				
						{
						echo " checked='checked'" ;
						}
					}
				?>
				"/>				
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info[id]; ?>,'ras')"
				<?php
					$requete2 ="SELECT refinfo.ref,refinfo.idinf"
		 					. " FROM refinfo"
							. " WHERE refinfo.idinf=$info[id]"; 
					$resultat2 = ExecRequete ($requete2, $connexion);
					while ($info2 = LigneSuivante($resultat2))
					{
					if (ereg('ras', $info2[ref]))				
						{
						echo " checked='checked'" ;
						}
					}
				?>				
				"/>
				<td><input type="checkbox" name="ref[]" value="(<?php echo $info[id]; ?>,'ram')"
				<?php
					$requete2 ="SELECT refinfo.ref,refinfo.idinf"
		 					. " FROM refinfo"
							. " WHERE refinfo.idinf=$info[id]"; 
					$resultat2 = ExecRequete ($requete2, $connexion);
					while ($info2 = LigneSuivante($resultat2))
					{
					if (ereg('ram', $info2[ref]))				
						{
						echo " checked='checked'" ;
						}
					}
				?>				
				"/>
			</tr>
		<?php
		}
		?>
		</table></center>
		<p><center>
		<INPUT TYPE=SUBMIT VALUE='Publier'></center>
		</form>

rspir

Eléphant du PHP | 95 Messages

09 août 2006, 10:38

J'ai le même problème. Mais il me semble que le code ci-dessus est en PHP 5. Or je dois faire mon projet en PHP 4.3.3

Comment puis-je adapter ce code sachant que je maîtrise pas du tout PHP 5... ?

Merci par avance
Je veux apprendre !!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 août 2006, 10:43

Ce code est tout a fait valide en PHP4 comme en PHP5.

Mais le meilleur moyen de savoir s'il marche, c'est de l'essayer ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 95 Messages

09 août 2006, 10:49

Pardon d'être aussi nul !

Je le teste de ce pas adapté à mon problème...
Je veux apprendre !!