Page 1 sur 2

avoir 2 groupes de résultats pour ma requete

Posté : 02 janv. 2008, 18:53
par Snipy
Bonjour à tous :)

J'ai hésité à mettre ce pots dans la partie php ou SQL...

Donc mon soucis est le suivant, j'ai une requète +ou- complexe avec un champ "date_prévue" pour chaque entré.

J'aimerais avoir 2 blocs sur ma page, l'un avec toute les entrés ou la date est inférieur à maintenant et l'autre avec la date => à maintenant.

Voici mon code actuel qui ne fais pas ce que je veux car il crée à chaque fois un bloc (un div)^^
$requete="SELECT equipes.nom AS equipe_dom, EXT.nom AS equipe_ext, phpl_matchs.buts_dom AS buts_dom , phpl_matchs.buts_ext AS buts_ext, phpl_matchs.id AS id_match, phpl_matchs.date_reelle, phpl_journees. date_prevue AS date_prevue
             FROM  phpl_matchs, phpl_journees, equipes, equipes as EXT 
			  WHERE equipes.id_equipe=phpl_matchs.id_equipe_dom 
             AND EXT.id_equipe=phpl_matchs.id_equipe_ext 
             AND($id_equipe = phpl_matchs.id_equipe_dom OR $id_equipe = phpl_matchs.id_equipe_ext) 
             AND phpl_matchs.id_journee=phpl_journees.id
             AND phpl_journees.id_champ='$id_champ'
             ORDER BY phpl_journees.numero";
echo $requete;			 
?>
<div id="corps">
<h1> Matchs de la saison</h1>

<?php

$resultat = mysql_query($requete) or die (mysql_error());    

while ($row = mysql_fetch_assoc($resultat))
  {
  
	$timestamp_match = strtotime($row['date_prevue']);
  
  
		if($timestamp_match < time())
		{
		echo '<div class="corps-sp1">
		<h2>Archivés </h2>'
		
		 .$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />
		</div>';
		}
		
		else
		{
		echo '<div class="corps-sp1">
		<h2>A venir </h2>'
		
		 .$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />
		</div>';
		}
  }
Dois je utiliser un GROUP BY ? Si c'est le cas peut on m'expliquer le fonctionnement car je n'ai pas l'habitude de l'utiliser.

Merci d'avance
Bonne soirée

Posté : 02 janv. 2008, 22:56
par Aureusms
Et si t'essaye cela ?

Code : Tout sélectionner

$requete="SELECT equipes.nom AS equipe_dom, EXT.nom AS equipe_ext, phpl_matchs.buts_dom AS buts_dom , phpl_matchs.buts_ext AS buts_ext, phpl_matchs.id AS id_match, phpl_matchs.date_reelle, phpl_journees. date_prevue AS date_prevue FROM phpl_matchs, phpl_journees, equipes, equipes as EXT WHERE equipes.id_equipe=phpl_matchs.id_equipe_dom AND EXT.id_equipe=phpl_matchs.id_equipe_ext AND($id_equipe = phpl_matchs.id_equipe_dom OR $id_equipe = phpl_matchs.id_equipe_ext) AND phpl_matchs.id_journee=phpl_journees.id AND phpl_journees.id_champ='$id_champ' ORDER BY phpl_journees.numero, date_prevue";

Posté : 02 janv. 2008, 23:08
par Snipy
Ils seront en effet ordonné je pense, mais ce que je veux en fait c'est
2 div

<div1>
Les dates < à maintenant
</div>

<div2>
Les autres dates
</div>

Posté : 02 janv. 2008, 23:12
par Aureusms
Pas le choix : 2 requêtes ou une condition dans tes résultats pour faire un tri avant affichage

EDIT : mais j'ai vu que tu l'avais déjà fais...

Posté : 02 janv. 2008, 23:15
par Snipy
Les conditions c'est ce que je fais dans mon code, mais comment je dois les placer pour avoir 2 blocs ? (car la je crée X blocs) car mes conditions sont dans ma boucle.

Sinon avec GROUP BY impossible?

Posté : 02 janv. 2008, 23:19
par Aureusms
Tiens je te fais cela mais ca vaut ce que ca vaut :
$k=0;
while ($row = mysql_fetch_assoc($resultat))
  {
  
    if ($kj == 0 )
       {
       $timestamp_match = strtotime($row['date_prevue']);
       $k=1;
       }
  
  
        if($timestamp_match < time())
        {
        echo '<div class="corps-sp1">
        <h2>Archivés </h2>'
        
         .$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />
        </div>';
        }
        
        else
        {
        echo '<div class="corps-sp1">
        <h2>A venir </h2>'
        
         .$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />
        </div>';
        }
  } 

Posté : 02 janv. 2008, 23:50
par Snipy
Voila c'est pas très beau ce que j'ai fait mais ça a le mérite de marcher...
while ($row = mysql_fetch_assoc($resultat))
  {
  
	$timestamp_match = strtotime($row['date_prevue']);
  
  
		if($timestamp_match < time())
		{
			if($k == 0)
			{
			echo '<div class="corps-sp1">
			<h2>Archivés </h2>';
			}
		echo '<p>
		<span style="color:rgb(100,100,100);">'.$row['date_prevue'].'</span> 
		<a href="voir_match.php?id_match='.$row['id_match'].'">'.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'</a>
		</p>';
		
			if($k == 0)
			{
			echo'</div>';
			}
		}
		
		else
		{
			if($g == 0)
			{
			echo '<div class="corps-sp1">
			<h2>A venir </h2>';
			}
		echo '<p>
		<span style="color:rgb(100,100,100);">'.$row['date_prevue'].'</span> <a href="voir_match.php?id_match='.$row['id_match'].'">'.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'</a> <a href = "feuille_match.php?id_match='.$row['id_match'].'" style="color:#710101";>Ordre du match </a>
		</p>';		
			if($k == 0)
			{
			echo '</div>';
			}
			
		}	
	$k=1;	
  }
par contre je ne comprend pas pourquoi je suis obliger de changer le nom à la 3ème petite condition ( $g) et pourquoi un $k =1 à la fin de la boucle est superflue?

Posté : 03 janv. 2008, 00:12
par Aureusms
Non ca ne peux pas marcher car tu indiques dans ta boucle while $k=1 donc au premier passage il sera à rien car tu n'a pas mis $k=0; avant ta boucle while et ensuite il sera toujours égale à 1.

Mon code précédent ne marchait pas ?
if ($kj == 0 )
       {
       $timestamp_match = strtotime($row['date_prevue']);
       $k=1;
       } 
Ce que je voulais indiquer est qu'il calcul une seule fois $timestamp_match pour être utiliser dans toute la boucle while

Posté : 03 janv. 2008, 00:14
par Snipy
J'avais mis le $k=0; avant la boucle ;)
Mais en fait non ça marche pas vraiment il se passe des trucs bizarres.

Mais concernant ton code je ne comprend pas pourquoi fixer le $timestamp puisqu'il est différent a chaque entrée?
j'essaye quand même et j'édite :)

EDIT : ça ne marche pas il y a toujours un div qui est cré pour chaque entré

Posté : 03 janv. 2008, 00:15
par Aureusms
Ah ouais pas bête :oops:

Posté : 03 janv. 2008, 00:16
par Snipy
Je replace mon edit ici^^

EDIT : ça ne marche pas il y a toujours un div qui est cré pour chaque entré

Posté : 03 janv. 2008, 00:25
par Aureusms
Méthodes radicales :
while ($row = mysql_fetch_assoc($resultat))
  {
  
    $timestamp_match = strtotime($row['date_prevue']);
  
  
        if($timestamp_match < time())
        {
        $match_passes = $match_passes.$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />';
        }
        
        else
        {
         $match_a_venir =  $match_a_venir.$row['date_prevue'].' '.$row['equipe_dom'].' '.$row['buts_dom'].' - ' .$row['buts_ext'].' '.$row['equipe_ext'].'<a href = "feuille_match.php?id_match='.$row['id_match'].'">Ordre du match </a><br />';
        }
  } 
//et en dehors de la boucle ...

        echo '<div class="corps-sp1">
        <h2>Archivés </h2>'.$match_passes.'
        </div>';

        echo '<div class="corps-sp1">
        <h2>A venir </h2>'.$match_a_venir.'</div>';
 
 
EDIT :J'ai cliqué trop vite sur ENVOYER

Posté : 03 janv. 2008, 00:37
par Xenon_54
2 requêtes SQL séparées pourraient être plus optimales que de construire une chaine de caractère pour ensuite l'afficher plus tard.

MySQL te permettra d'optimiser plus efficacement la sélection de tes matches selon la date grâce aux index SQL.

Posté : 03 janv. 2008, 23:03
par Snipy
Aureusms > Nickel ça marche
Par contre je ne saisis pas pourquoi. car dans la boucle à chaque fois la variable $match_passes prend une nouvelle valeur cela n'annule pas la première?
Je pensais qu'on était obligé de passer par un array pour avoir toutes les données.

la question est surement bête, mais merci de m'éclairer :)

Posté : 03 janv. 2008, 23:06
par Xenon_54
Le résultat est concatené à lui-même:
$match_passes = $match_passes . $row['date_prevue'] . '........';
Ceci aurait été son équivalent:
$match_passes .= $row['date_prevue'] . '........';