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 :

[PostGreSQL] Trier une liste ayant deux requêtes comme source


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut [PostGreSQL] Trier une liste ayant deux requêtes comme source
    Bonjour, j'ai crée une liste déroulante qui récupère les données de deux requetes différentes(ce sont des dates),comment pouvoir trier dans ma liste les données de mes deux requetes confonduent?
    Voiçi un petit bout de mon code si ça peu vous intéresser :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
             .
             .
             .
    $connection_pg=ConnectionPg ();
     
    //cette requete récupère les sessions se déroulant sur un même mois
        $rq  = "SELECT sessionid,EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession,EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,EXTRACT(DAY FROM datefinsession) as jourfinsession,EXTRACT(MONTH FROM datefinsession) as moisfinsession,EXTRACT(YEAR FROM datefinsession) as anneefinsession from f_session where secteuridsession=".$sectidsess." And datedebsession >= CURRENT_DATE ORDER BY datedebsession;";
     
       $result= pg_query ($rq) or die ("Select impossible");
     
    //cette requete récupère les sessions se déroulant à cheval sur 2 mois
       $rqcoupe="SELECT sessionid,EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession,EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,EXTRACT(DAY FROM datefinsession) as jourfinsession,EXTRACT(MONTH FROM datefinsession) as moisfinsession,EXTRACT(YEAR FROM datefinsession) as anneefinsession from f_session where secteuridsession=".$sectidsess." And datedebsession >= CURRENT_DATE AND coupe=TRUE;";
                     $resultcoupe=pg_query ($rqcoupe) or die ("Select impossible");
                     $num=pg_num_rows($resultcoupe);
       ?>
     
    <form name="Forminscrip" method='POST' action='formcreatinscri.php'>
    <div class="titre_page" align="center"> Validation des préinscriptions :</div><br>
    <br><br>
    <table class="script" border="1" align="center" cellpadding="1" cellspacing="2" summary="">
           <tr>
               <td class="titre"><b>choix de la session</b></td>
     
                <td>
                <?php if ((pg_num_rows($result)>0) or (pg_num_rows($resultcoupe)>0)){       ?>
                    <select size="1" name="sess" OnChange="sendData('id='+this.value,'tests2.php')" onKeyUp="sendData('id='+this.value,'ajaxLDinscri.php')">
     
                    <?php
     
                    while ($dt=pg_fetch_row($result))
                    {
                    // Remplir la liste avec les données de la première requete
    	        echo "<option value=".($dt[0]).">11Session du ".($dt[1])."-".($dt[2])."-".($dt[3])." au ".($dt[4])."-".($dt[5])."-".($dt[6])."</option>";
                          if ($i==0) { $j=$dt[0]; $i=1; } // garder la valeur du premier enregistrement
     
     
     
     
                     }
     
                     for ($k=0;$k<=$num-1;$k++){
                     if($k+1 != $num){
                     $arr1 = pg_fetch_array ($resultcoupe,$k, PGSQL_NUM);
                     $arr2 = pg_fetch_array ($resultcoupe,$k+1, PGSQL_NUM);
                     if($arr1[0]==$arr2[0]-1){
    //données de la seconde requete
                     echo "<option value=".($arr1[0]).">Session du ".($arr1[1])."-".($arr1[2])."-".($arr1[3])." au ".($arr2[4])."-".($arr2[5])."-".($arr2[6])."</option>";}}}
     
                    echo"</select>";}
                    else  {echo ("Aucune session de prévue pour ce secteur");}
                    ?>
     
                </td>
           </tr>
             .
             .
             .
    Tout ça marche mais ma liste est triée en deux parties,1ere requete puis seconde.
    Si quelqu'un a une idée

  2. #2
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut,

    Il suffit de grouper tes seux SELECT avec la clause UNION et de mettre le ORDER BY à la fin de cette nouvelle requête.

    En plus, UNION se chargera d'éliminer les doublons, ce que tu désires faire aussi je pense. Sinon, pour garder les doublons : UNION ALL

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Bon, ca peut être une idée mais tant qu'à faire .

    Tu récupères la premiere liste dans un tableau, la deuxième dans un tableau. Puis tu fusionnes les deux tableaux (grâce aux fonctions array).

    Puis tu fais directement un trie sur le tableau (ou peut etre utiliser la fonction qui le fait) Puis il reste plus qu'à afficher.

    C'est une idée mais peut fonctionner

    Sinon la réponse ci dessus parait abordable aussi

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    OK, j'vai tenter ça

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    JUste une précision pour la solution UNION et clause ORDER BY.

    Je pense qu'il faudra peut être passer cette requete en table dérivée pour que cette clause passe, si l'on veux l'ordonner, quelque chose comme çà :

    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
    23
    24
    25
    26
     
    $rq  = "SELECT * FROM
    (
    SELECT sessionid,
    EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession,
    EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,
    EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,
    EXTRACT(DAY FROM datefinsession) as jourfinsession,
    EXTRACT(MONTH FROM datefinsession) as moisfinsession,
    EXTRACT(YEAR FROM datefinsession) as anneefinsession,
    datedebsession
    from f_session 
    where secteuridsession=".$sectidsess." And datedebsession >= CURRENT_DATE
    UNION
    SELECT sessionid,
    EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession,
    EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,
    EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,
    EXTRACT(DAY FROM datefinsession) as jourfinsession,
    EXTRACT(MONTH FROM datefinsession) as moisfinsession,
    EXTRACT(YEAR FROM datefinsession) as anneefinsession,
    datedebsession
    from f_session 
    where secteuridsession=".$sectidsess." And datedebsession >= CURRENT_DATE AND coupe=TRUE
    ) AS DERIVED_TABLE
    ORDER BY datedebsession;";
    il n'y a pas de sotte existence

  6. #6
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Citation Envoyé par gisele
    Je pense qu'il faudra peut être passer cette requete en table dérivée pour que cette clause passe, si l'on veux l'ordonner,
    Je ne pense pas que cela soit nécessaire car le ORDER BY s'applique au résultat, à moins que les deux select soient parenthésés et que le ORDER BY soit placé dans un groupe.

    http://www.postgresql.net/docs/8.1/i...html#SQL-UNION

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Oui c'est vrai ,
    c'est moi qui systématise cette mise en sous-requete pour la clarté d'ensemble, mais tu as raison , l'ORDER serait bien rattaché à la globalité des résultats.
    il n'y a pas de sotte existence

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    J'ai fait l'union, ça marche
    voiçi ma requete :
    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
    23
    24
    25
    26
    27
    28
     
    SELECT sessionid,
    datedebsession,
    coupe,
    idpart2,
    EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession,
    EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,
    EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,
    EXTRACT(DAY FROM datefinsession) as jourfinsession,
    EXTRACT(MONTH FROM datefinsession) as moisfinsession,
    EXTRACT(YEAR FROM datefinsession) as anneefinsession 
    from f_session 
    where secteuridsession=1 And datedebsession >= CURRENT_DATE 
    UNION 
    SELECT sessionid,
    datedebsession,
    coupe,
    idpart2,
    EXTRACT(DAY FROM f_session.datedebsession) as jourdebsession2,
    EXTRACT(MONTH FROM f_session.datedebsession) as moisdebsession,
    EXTRACT(YEAR FROM f_session.datedebsession) as anneedebsession,
    EXTRACT(DAY FROM datefinsession) as jourfinsession,
    EXTRACT(MONTH FROM datefinsession) as moisfinsession2,
    EXTRACT(YEAR FROM datefinsession) as anneefinsession2 
    from f_session 
    where secteuridsession=1 
    And datedebsession >= CURRENT_DATE 
    AND coupe=TRUE ORDER BY datedebsession;
    Elle marche nikel, maintenant le bins c'est de réinsérer tout proprement dans ma liste (en regroupant les enregistrements qui correspondent a une seule session physique coupée en 2,donc 2 sessions dans la table), mais j'approche du but,merçi pour votre aide en tout cas

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Y a peut etre pas grand chose a faire de plus sur la requete pour que ca te mache le travail.
    Comment elles sont reliées des demi-sessions ?
    il n'y a pas de sotte existence

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    Il y a un champ coupé(bool) et un un champ idpart2 qui reprend l'identifiant de l'autre demi session

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Et dans quelles modalités tu veux refusionner les 2 demi-session?

    genre l'id_session de la première moitié,
    le début de session de la première moitié
    le fin de session de la 2 eme moitié

    Quelque chose comme çà non?
    pour les "premières moitiés" le idpart2 est a null c'est çà?

    Voila si le but est de daire de 2 entrées qui se complètent une seule session entière, dans la 2eme requete de l'UNION , je pense qu'une auto-jointure peut régler ton problème.
    il n'y a pas de sotte existence

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Points : 97
    Points
    97
    Par défaut
    Et dans quelles modalités tu veux refusionner les 2 demi-session?

    genre l'id_session de la première moitié,
    le début de session de la première moitié
    le fin de session de la 2 eme moitié

    Quelque chose comme çà non?
    pour les "premières moitiés" le idpart2 est a null c'est çà?

    Voila si le but est de daire de 2 entrées qui se complètent une seule session entière, dans la 2eme requete de l'UNION , je pense qu'une auto-jointure peut régler ton problème.

    Je voulais simplement que dans ma liste on ai comme début de la session la date de début de la 1ere moitié et comme date de fin celle de la 2d moitié.
    J'ai réussi à régler mon problème en bidouillant mes enregistrements dans mon code php en jouant sur les index des tableaux et sur idpart2
    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
         for ($m=0;$m<=$num-1;$m++)
             {
             //$arr_test1 = pg_fetch_array ($result,$m, PGSQL_NUM);
             //if ($i==0) { $j=$arr_test1[0]; $i=1; }
             if($m+1 != $num)
                     {
                     $arr_test1 = pg_fetch_array ($result,$m, PGSQL_NUM);
                     $arr_test2 = pg_fetch_array ($result,$m+1, PGSQL_NUM);
                     //if ($i==0) { $j=$arr_test1[0]; $i=1; }
                     if ($m==0) { $j=$arr_test1[0];}
                     if(($arr_test1[0]==$arr_test2[0]-1) AND ($arr_test1[2]==TRUE))
                          {echo "<option value=".($arr_test1[0]).">Session du ".($arr_test1[4])."-".($arr_test1[5])."-".($arr_test1[6])." au ".($arr_test2[7])."-".($arr_test2[8])."-".($arr_test2[9])."</option>";}
                     else
                          {if($arr_test1[2]!=TRUE){echo "<option value=".($arr_test1[0]).">Session du ".($arr_test1[4])."-".($arr_test1[5])."-".($arr_test1[6])." au ".($arr_test1[7])."-".($arr_test1[8])."-".($arr_test1[9])."</option>";}}
                     }
             else
                     {
                     $arr_test1 = pg_fetch_array ($result,$m, PGSQL_NUM);
                     if($arr_test1[2]!=TRUE)
                                     {
                                     echo "<option value=".($arr_test1[0]).">Session du ".($arr_test1[4])."-".($arr_test1[5])."-".($arr_test1[6])." au ".($arr_test1[7])."-".($arr_test1[8])."-".($arr_test1[9])."</option>";
                                     }
                     }
             }
     
    echo"</select>";}
    else  {echo ("Aucune session de prévue pour ce secteur");}
    ?>
    Du coup ça marche et plus besoin de modifier la requete.
    Merçi beaucoup pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/11/2016, 22h32
  2. trier une list
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 12h01
  3. Réponses: 5
    Dernier message: 15/11/2005, 12h57
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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