IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Regrouper des lignes


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut Regrouper des lignes
    Bonjour à tous et bonne année,

    Voila mon probleme, j'ai une table que voici :

    http://copenaol.free.fr/reserv.jpg
    Desolé la fonction Image ne fonctionnant pas, je met cette URL.

    Pour le moment j'arrive a liste chaque row :

    Du 30-01-2010 au 06-02-2010 ==> 300
    Du 10-04-2010 au 17-04-2010 ==> 990
    Du 17-04-2010 au 24-04-2010 ==> 990
    ...

    Mais je souhaite avoir ce resultat :

    Du 30-01-2010 au 06-02-2010 ==> 300
    Du 10-04-2010 au 01-05-2010 ==> 990
    Du 01-05-2010 au 15-05-2010 ==> 1090

    Que chaque periode soit regroupée en fonction du prix (si le prix est le même).

    Voici le code utilisé pour l'affichage par ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $reservationprix = mysql_query("SELECT * from reserv WHERE idannonce='".$annonce."' AND etat='1'");
    $nprix = mysql_num_rows($reservationprix);
     
    $j=0;
     
    while ($j<$nprix) {
     
    $a = mysql_result($reservationprix,$j,"id");
    $dd = mysql_result($reservationprix,$j,"datedeb");			  
    $df = mysql_result($reservationprix,$j,"datefin");	
    $prix = mysql_result($reservationprix,$j,"prix");
    $datedebb= explode("-",$dd);
    $datedebbis= $datedebb[2].'-'.$datedebb[1].'-'.$datedebb[0];
    $datefinb= explode("-",$df);
    $datefinbis= $datefinb[2].'-'.$datefinb[1].'-'.$datedebb[0];  
     
    echo "<tr>
    <td width=\"100\" align=\"left\" valign=\"middle\" class=\"td3\"><div align=\"left\">Du ".$datedebbis."<br> Au ".$datefinbis."</div></td>
    <td width=\"40\" align=\"center\" valign=\"middle\" class=\"td3\"><div align=\"center\">".$prix." </div></td>
    </tr>";			  
    $j=$j+1; }
    Pouvez vous m'aider afin d'obtenir cet affichage groupé ? Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2009
    Messages : 46
    Points : 74
    Points
    74
    Par défaut
    Bonjour

    Je pense que DISTINCT faira l'affaire.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $reservationprix = mysql_query("SELECT DISTINCT prix, * from reserv WHERE idannonce='".$annonce."' && etat='1'");
    $nprix = mysql_num_rows($reservationprix);
    ?>
    Sky

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca pourrait donner ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MIN(datedeb) as datedeb, MAX(datefin) as datefin, prix  FROM reserv  WHERE idannonce=5 GROUP BY prix
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut
    Bonjour,
    Citation Envoyé par sabotage Voir le message
    Ca pourrait donner ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MIN(datedeb) as datedeb, MAX(datefin) as datefin, prix  FROM reserv  WHERE idannonce=5 GROUP BY prix
    Ca marche ... presqueeeeee

    Si j'ai ca :

    Du 30-01-2010 au 06-02-2010 ==> 300
    Du 10-04-2010 au 01-05-2010 ==> 990
    Du 01-05-2010 au 15-05-2010 ==> 300

    Ca affiche ca

    Du 30-01-2010 au 15-05-2010 ==> 300
    Du 10-04-2010 au 01-05-2010 ==> 990


    Tu saurias comment faire pour eviter ceci ? Voici un Sc de la table. Si les ids se suivent et que le prix est le meme alors requete mais je ne sais pas comment traduire ceci en SQL


    merci d'avance
    Images attachées Images attachées  

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Effectivement je n'ai pas pensé aux plages discontinues.
    En SQL je ne vois pas ... du coup j'analyserais ligne par ligne en PHP une requête simple triée par prix et par date : tant que la date de début = date de fin de la précédente et que le prix ne change pas, je suis dans une même période de prix.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut
    Je vais le faire et le posterai car je pense que je vais avoir besoin d'aide. Merci encore

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut
    Je dépoussiere ce post car je voudrais finir cette partie :

    Ma requete (simple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $reservationprix = mysql_query("SELECT * from reserv WHERE idannonce='".$annonce."' AND etat='1'");
    $nprix = mysql_num_rows($reservationprix);
     
    $j=0;
     
    while ($j<$nprix) {
     
    $a = mysql_result($reservationprix,$j,"id");
    $dd = mysql_result($reservationprix,$j,"datedeb");			  
    $df = mysql_result($reservationprix,$j,"datefin");	
    $prix = mysql_result($reservationprix,$j,"prix");
    $datedebb= explode("-",$dd);
    $datedebbis= $datedebb[2].'-'.$datedebb[1].'-'.$datedebb[0];
    $datefinb= explode("-",$df);
    $datefinbis= $datefinb[2].'-'.$datefinb[1].'-'.$datedebb[0];  
     
    echo "<tr>
    <td width=\"100\" align=\"left\" valign=\"middle\" class=\"td3\"><div align=\"left\">Du ".$datedebbis."<br> Au ".$datefinbis."</div></td>
    <td width=\"40\" align=\"center\" valign=\"middle\" class=\"td3\"><div align=\"center\">".$prix." </div></td>
    </tr>";			  
    $j=$j+1; }
    Maintenant à partir de cela, voici l'algo de ce que je souhaite :

    Citation Envoyé par sabotage
    tant que la date de début = date de fin de la précédente et que le prix ne change pas, je suis dans une même période de prix.
    en php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while($dd == mysql_result($reservationprix,$j-1,"datedeb") && $prix == mysql_result($reservationprix,$j,"prix")) {
    meme periode (je ne sais pas comment traduire de ceci)
    } else {
    echo "<tr>
    <td width=\"100\" align=\"left\" valign=\"middle\" class=\"td3\"><div align=\"left\">Du ".$datedebbis."<br> Au ".$datefinbis."</div></td>
    <td width=\"40\" align=\"center\" valign=\"middle\" class=\"td3\"><div align=\"center\">".$prix." </div></td>
    </tr>";		
    }
    Y aurait-il pas plus simple ??? Je ne vois pas

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Je suis toujours sur ce topic... et toujours en panne
    L'algo est toujours le meme.

    tant que la date de début = date de fin de la précédente et que le prix ne change pas, je suis dans une même période de prix.
    La requete, simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reservationprix = mysql_query("SELECT * from reserv WHERE idannonce='".$annonce."' AND etat='1'");
    $nprix = mysql_num_rows($reservationprix);
    Ma table :



    Je ne sais pas comment faire, verifier les dates si elles sont continues ? ou les ids s'ils sont continues ?

    Merci pour votre aide

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne sais pas comment faire, verifier les dates si elles sont continues ? ou les ids s'ils sont continues ?
    Je te l'ai dit : il faut lire les lignes une par une et verifier pour chaque ligne si la date de début est égale à la date de fin de la ligne précédente et si le prix est le même (il faut donc garder de côté la valeur de fin et le prix de la ligne précédente a chaque tour de boucle)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Je te l'ai dit : il faut lire les lignes une par une et verifier pour chaque ligne si la date de début est égale à la date de fin de la ligne précédente et si le prix est le même (il faut donc garder de côté la valeur de fin et le prix de la ligne précédente a chaque tour de boucle)
    c'est avec cela que j'ai du mal, je n'ai aucune idee de comment comparer deux rows differentes en php...

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Comme je te l'ai dit indiqué, il ne s'agit pas de comparer deux lignes, il s'agit de :
    1 - lire une ligne
    2 - mettre de côté dans des variables sa date de fin et son prix
    3 - comparer sa date de fin et son prix avec les valeurs mises de côté pour la ligne d'avant
    et continuer
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/03/2010, 13h36
  2. Regrouper des lignes avec un INNER JOIN
    Par Barsy dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/11/2009, 14h18
  3. SQL : Regrouper des lignes dans une seule colonne
    Par manoir62 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h06
  4. Regrouper des lignes dans un t:dataTable
    Par kwiky dans le forum JSF
    Réponses: 1
    Dernier message: 12/08/2008, 17h05
  5. Regrouper des lignes
    Par xenos dans le forum Excel
    Réponses: 2
    Dernier message: 12/03/2007, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo