Optimiser une requête SQL pour PHP [Résolu]

- - Dernière réponse :  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
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
27059
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2019
318
1
Merci
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'];
}



Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45