regrouper les résultats - boucles imbriquées ?

Petit nouveau ! | 5 Messages

07 sept. 2006, 11:16

Bonjour,

voilà j'ai deux tables :
concerts (table 1)
id - date - (...)

groupes (table 2)
id - idconcert - nom - (...)

j'ai un problème pour regrouper les noms des groupes par date. Je voudrais :

JEUDI 12 SEP
groupe 1
groupe 2

VENDREDI 13 SEP
groupe 3
groupe 4


Code : Tout sélectionner

$sql = "SELECT * FROM concerts, groupes WHERE concerts.id= groupes.idconcert AND concerts.afficher=1 AND concerts.date>='$today'ORDER BY concerts.date asc"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $count=mysql_num_rows($req);

for ($a = 1; $a < $count; $a++) {
$data1 = mysql_fetch_array($req);
$date1 = "".$data1["date"]."";
$nom1 = "".$data1["nom"]."";

echo"
$datefr1<br>
$nom1<br>";}
et ça m'affiche

JEUDI 12 SEP
groupe1

JEUDI 12 SEP
groupe 2

VENDREDI 13 SEP
groupe3

VENDREDI 13 SEP
groupe 4


faut-il passer par des requêtes ou des boucles imbriquées ?
Je suis un peu paumé ...

Eléphant du PHP | 183 Messages

07 sept. 2006, 11:31

Salut

J'ai exacetement ce que j'ai voulais faire :)

regarde ici :) >>

http://www.phpfrance.com/forums/voir_sujet-22015.php

Mammouth du PHP | 19672 Messages

07 sept. 2006, 11:34

en ajoutant un simple élément dans ta boucle, ça serait encore plus simple, proposition:
<?php
//...
/* On crée un point de repère pour détecter les changements de date */
$d = "";
for ($a = 1; $a < $count; $a++)
{
    $data1 = mysql_fetch_array($req);
    $date1 = "".$data1["date"]."";
    $nom1 = "".$data1["nom"]."";
    /* Si la date a changé, on l'affiche */
    if($d != $datefr1)
    {
        /* On assigne la nouvelle date à notre point de repère */
        $d = $datefr1;
        echo $datefr1 ."<br>";
    }
    echo $nom1 ."<br>";
}
//...
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

07 sept. 2006, 11:53

Merci beaucoup Cyrano ! ça fonctionne à merveille. Je pensais mais alors pas du tout à ça...

merci aussi fabien_14.

Petit nouveau ! | 5 Messages

08 sept. 2006, 11:49

oups, je suis en fait encore bloqué ...

en fait j'aurais besoin d'un affichage tel que :

date1= JEU 12 SEP
titre1= GROUPE 1 GROUPE 2

date2= VEN 13 SEP
titre2= GROUPE 3 GROUPE 4


alors que ça me donne :

date1= JEU 12 SEP
titre1= GROUPE 1
titre2= GROUPE 2

date3= VEN 13 SEP
titre3= GROUPE 3
titre4= GROUPE 4

$sql1 = "SELECT * FROM concerts, groupes WHERE concerts.id= groupes.idconcert AND concerts.afficher=\"1\" AND concerts.date>='$today' ORDER BY concerts.date asc";
$req1 = mysql_query($sql1) or die('Erreur SQL !<br>'.$sql1.'<br>'.mysql_error());
	
$count=mysql_num_rows($req1);


//... 
/* On crée un point de repère pour détecter les changements de date */ 
$d = ""; 
for ($a = 1; $a < $count; $a++) 
{ 
    $data1 = mysql_fetch_array($req1); 
    $date1 = "".$data1["date"].""; 
    $datefr1 = realdate($date1);
    $nom1 = "".$data1["nom"].""; 
    /* Si la date a changé, on l'affiche */ 
    if($d != $datefr1) 
    { 
        /* On assigne la nouvelle date à notre point de repère */ 
        $d = $datefr1; 
        echo "&date".$a."=".$datefr1."&<br>"; 
	} 
     echo "&titre".$a."=".$nom1."&<br>";
} 
//... 

merci pour votre aide ...

Mammouth du PHP | 19672 Messages

08 sept. 2006, 12:44

Alors modifie les instructions d'affichage de façon à ce que "titre =" n'apparaisse qu'une fois, en même temps que la date, donc dans le même if testant le changement de date. Ça donne quelque chose dans le genre :
<?php
$sql1 = "SELECT * ".
        "FROM concerts, groupes ".
        "WHERE concerts.id = groupes.idconcert ".
        "AND concerts.afficher = \"1\" ".
        "AND concerts.date >='$today' ".
        "ORDER BY concerts.date asc";
$req1 = mysql_query($sql1) or die('Erreur SQL !<br>'.$sql1.'<br>'.mysql_error());
    
$count = mysql_num_rows($req1);

//... 
/* On crée un point de repère pour détecter les changements de date */ 
$d = ""; 
for ($a = 1; $a < $count; $a++) 
{ 
    $data1 = mysql_fetch_array($req1); 
    $date1 = "".$data1["date"].""; 
    $datefr1 = realdate($date1);
    $nom1 = "".$data1["nom"].""; 
    /* Si la date a changé, on l'affiche */ 
    if($d != $datefr1) 
    { 
        /* On assigne la nouvelle date à notre point de repère */ 
        $d = $datefr1; 
        echo "<br>&date". $a ."=".$datefr1."&<br>"; 
        echo("&titre". $a ." = ");
    } 
     echo $nom1 ." ";
} 
//... 
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

08 sept. 2006, 15:47

et pour ajouter un "&" à la fin de chaque ligne des groupes ? (et pas entre les noms des groupes) ?

si tu as de la logique en stock, je t'en prendrais bien quelques kilos :-k

Mammouth du PHP | 19672 Messages

08 sept. 2006, 16:45

Pour la logique, mets-toi au niveau de la logique d'un ordinateur :
  • 0 ou 1
  • ouvert ou fermé
  • vrai ou faux
  • oui ou non
Pars de là et essaye de suivre le code en te demandant ce qui se passe à tel endroit du code. Que se passe-t-il dans une boucle ? Quand s'arrête la boucle et que se passe-t-il après ?

C'est vraiment de la logique élémentaire, il ne faut pas chercher midi à quatorze heures et essayer d'interpréter des formule cabbalistiques, il faut simplement comprendre le principe de l'alternative oui ou non.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

10 sept. 2006, 21:55

Ca m'a fait justement découvrir que je n'allais pas dans le bon sens.

Une nouvelle fois merci Cyrano.