Optimiser une requête SQL pour PHP

Résolu
Utilisateur anonyme - 3 mars 2014 à 16:36
 Utilisateur anonyme - 3 mars 2014 à 17:00
Bonjour,

Je viens de gérer un petit système de news.

A savoir, une news comporte un service et une date, et optionnellement une heure (pour les rendez-vous).

Mes tables
services (id, nom)

actualites (id, date, heure, actu, service)

Ce que j'obtiens
ACHATS
une première actu

COMMERCIAL
une autre

ENGINEERING
encore une autre

	
ENGINEERING
09:00 : Premier rdv

	
RESSOURCES HUMAINES
09:00 : Deuxième rdv

SERVICE CLIENT
et les autres actus

Ce que j'aimerais

Si vous regardez le paragraphe au-dessus, vous voyez deux fois ENGINEERING, et je voudrais optimiser tout ça pour ne voir qu'une seule fois le service pour les deux actus qui le concernent.

Ais-je été claire ? ^^

PHP

/**
	 * Lister les actualités par jour
	 *
	 * @param 	jour 	Date au format Y-m-d
	 * @return			Un tableau d'actualités
	 */
	function listerActualites ($jour, $service='')
	{
		global $bdd;
		$suite = '';
		
		try
		{
			if ($service!='')
			{
				$suite = "AND actualites.service = '$service'";
			}

			$req = $bdd ->prepare("SELECT actualites.id, date, heure, actu, nom, service FROM actualites, services where actualites.service = services.id and date='$jour' $suite order by nom, heure");
			$req->execute();
			$actus = $req->fetchAll(); 
			nouveauLog (date("Y-m-d H:i:s"), "OK", "","fonction listerActualites");
		}
		catch(Exception $e)
		{
			die (nouveauLog (date("Y-m-d H:i:s"), "NOK", $e->getMessage() ,"fonction listerActualites"));
		}	
		
		return $actus;
	}
/**
	 * Liste les Services
	 *
	 * @return 				Un Tableau de services
	 */
	function listerServices ()
	{
		global $bdd;
		$req = $bdd ->prepare("SELECT * FROM services ORDER BY nom");
		$req->execute();
		$resultats = $req->fetchAll();
		return $resultats;
	}


La page ...
<table>
	<?php
	$compteur=0;
	foreach($services as $unService) 
	{
		$listeActusAgenda = $actusAgenda->listerActualites ($dateSQL, $unService['id']);

		foreach($listeActusAgenda as $uneActu) 
		{		
			if (strstr($uneActu['actu'], "Réunion"))
			{
				$image = '<img src="vue/css/images/reunion.jpg" />';
			}
			else if (strstr($uneActu['actu'], "Visite"))
			{
				$image = '<img src="vue/css/images/visite.jpg" />';
			}
			else if (strstr($uneActu['actu'], "Comité Entreprise"))
			{
				$image = '<img src="vue/css/images/ce.jpg" />';
			}
			else if ($uneActu['heure']!='')
			{
				$image = '<img src="vue/css/images/default.jpg" />';
			}
			else
			{
				$image = "";
			}
									
			if ($uneActu['service'] == $unService['id'])
			{
				echo '<tr><td>'.$image.'</td><td>';
			        echo '<h2><b>'.$unService['nom'].'</h2></b>';
				if ($uneActu['heure']==null)
				{
					echo nl2br($uneActu['actu']) .'<br><br>';
				}
				else
				{
					echo '<b>'.$uneActu['heure'] . '</b> : ' . $uneActu['actu'] .'<br><br>';
				}
			}
			$compteur++;
			echo '</td></tr>';
		}
	}
							
	if ($compteur==0)
	{
		echo 'Aucune actualité.';
	}
?>
</table>


Merci par avance ...
Je suis persuadée que ce n'est pas grand chose, mais à force je m'y perd :)

AsrahZarh

1 réponse

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
3 mars 2014 à 16:53
Bonjour,

Je ne pense pas que ce soit une optimisation de ta requête qu'il te faille...

Il faut juste que lorsque tu parcours tes enregistrements (dans ton code PHP) tu vérifie si le service est le même que le précédent.

Si le nom du service = le nom du service précédent alors tu n'écris que son détail..
Sinon.. tu écris le nom du service...

un truc du genre :

<?php
	$compteur=0;
        $servPrec="";
foreach($services as $unService) 

// ....

if ($uneActu['service'] == $unService['id']){
    if($unService['nom']!=$servPrec){
	echo '<tr><td>'.$image.'</td><td>';
	echo '<h2><b>'.$unService['nom'].'</h2></b>';
      }
		if ($uneActu['heure']==null){
			echo nl2br($uneActu['actu']) .'<br><br>';
		}else	{
			echo '<b>'.$uneActu['heure'] . '</b> : ' . $uneActu['actu'] .'<br><br>';
		}
$servPrec=$unService['nom'];
}



1
Utilisateur anonyme
3 mars 2014 à 17:00
Merci beaucoup :)
0
Rejoignez-nous