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

Utilisateur anonyme - 3 mars 2014 à 16:36 - 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 

Votre réponse

2 réponses

Meilleure réponse
jordane45 21697 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 juillet 2018 Dernière intervention - 3 mars 2014 à 16:53
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'];
}



Merci jordane45 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.