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 :

Ordonner par date et heure sur 2 tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut Ordonner par date et heure sur 2 tables
    Salut à tous.
    Je suis entrain de monter une sorte d'agenda sur une base de jMonthCalendar (que je recommande d'ailleurs vivement)
    J'y ai ajouté en fait des possibilités d'ajouts de rappels et de rendez-vous.

    Pour faire simple, lors de l'initialisation de l'agenda, jMonthCalendar réclame un tableau events du style suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var events = [     
        { "EventID": 1, "Date": new Date(2009, 1, 1), "Title": "10:00 pm - EventTitle1", "URL": "#", "Description": "This is a sample event description", "CssClass": "Birthday" },
        { "EventID": 2, "Date": new Date(2009, 1, 2), "Title": "9:30 pm - this is a much longer title", "URL": "#", "Description": "This is a sample event description", "CssClass": "Meeting" }
    ];
    D'un autre côté, j'ai 2 tables (rappels et rendez_vous) contenant chacunes des tuples.
    Je construit donc ce tableau dynamiquement de la manière suivante avant de le passer en argument à l'initialisation de jMonthCalendar :
    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
     
    $db = new DB();
                    $rdvs = $db->query("SELECT * FROM rendez_vous WHERE assigned_to='".$_SESSION['id_user']."' ORDER BY date,heure");
                    $rappels = $db->query("SELECT * FROM rappels WHERE assigned_to='".$_SESSION['id_user']."' ORDER BY date,heure");
     
                    $events = "" ;
                    $event_id = 1 ;
                    $nb_events = mysql_num_rows($rdvs);
                    $nb_rappels = mysql_num_rows($rappels);
     
                    while($rdv = mysql_fetch_array($rdvs))
                    {
                        $annee = substr($rdv['date'],0,4) ;
                        $mois = substr($rdv['date'],5,2)-1 ;
                        $jour = substr($rdv['date'],8,2)-1+1;
                        $title = substr($rdv['heure'],0,5)." - ".$rdv['ville'] ;
                        $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_event.php?id_event=".$rdv['id_rdv']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_event.php?id_event=".$rdv['id_rdv']."\",\"del_URL\": \"includes/content/accueil/popup/delete_event.php?id_event=".$rdv['id_rdv']."\", \"CssClass\":\"Event\" }" ;
                        if($event_id!=$nb_events)
                            $events .= ",";
                        $event_id++ ;
                    }
                    $event_id = 1 ;
                    if($nb_rappels!=0)
                    {
                        $events .= ",";
                        while($rappel = mysql_fetch_array($rappels))
                        {
                            $annee = substr($rappel['date'],0,4) ;
                            $mois = substr($rappel['date'],5,2)-1 ;
                            $jour = substr($rappel['date'],8,2)-1+1;
                            $title = substr($rappel['heure'],0,5)." - ".$rappel['titre'] ;
                            $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_rappel.php?id_event=".$rappel['id_rappel']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_rappel.php?id_event=".$rappel['id_rappel']."\",\"del_URL\": \"includes/content/accueil/popup/delete_rappel.php?id_event=".$rappel['id_rappel']."\", \"CssClass\":\"Remind\" }" ;
                            if($event_id!=$nb_rappels)
                                $events .= ",";
                            $event_id++ ;
                        }
                    }
    Seulement, je me retrouve avec les rappels forcément en dessous des rendez-vous même si l'heure du rappel est plus tôt que celle du rendez-vous (ce qui d'un point de vue algorithmique est logique aux vues de mon code).
    Je vous ai mis une PJ sur laquelle vous pourrez constater le problème.

    Comment faire alors pour avoir le tout ordonné correctement ?
    Merci pour vos conseils.

    Ah oui, j'ai oublié de dire que les rappels sont sur fond rose et les rendez-vous sur fond bleu
    Images attachées Images attachées  

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Salut,
    Tu as essayé avec une union des deux selects ?
    Comme ça tu n'as qu'un seul tri sur les 2 ensembles.

  3. #3
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Qu'entends-tu par union sur les 2 selects ?

  4. #4
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Je suppose qu'il veut dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $rdvs = $db->query("SELECT * FROM rendez_vous WHERE assigned_to='".$_SESSION['id_user']."' ORDER BY date,heure
    UNION
    SELECT * FROM rappels WHERE assigned_to='".$_SESSION['id_user']."' ORDER BY date,heure);
    Enfin je crois^^

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Merci Obito d'avoir explicité ma pensée.

  6. #6
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Pas possible étant données que les tables ont un nombre de champs différents mais l'idée était bonne !

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Ben tu n'as qu'à spécifier les champs à récupérer de manière à ce que les 2 selects te sortent le même ensemble. Eventuellement, tu sors des colonnes vides si une des tables ne contient pas des colonnes indispensable sur l'autre.

  8. #8
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Mais du coup il faut ensuite que je refasse un appel sur la BDD pour récupérer les reste des colonnes ?
    Comment fais-tu pour obtenir des colonnes vides sans retour d'erreurs MYSQL ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Soient :
    table1 ( col1, col2)
    table2(col2, col3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select col1, col2, '' as col3 from table1 where col1 = 'toto'
    union
    select '' as col1, col2, col3 from table2 where col2 = 'titi'
    order by col2
    comme ça tu récupère tout d'un coup en faisant un cast des colonnes absentes à partir d'une valeur littérale.

  10. #10
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Parfait Chef, je teste tout ca et je te tiens au jus !
    MARKKKIIIIIII beaucoup !

  11. #11
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Mauvaise nouvelle beeboo !
    Ca ne marche pas du tout mais alors vraiment pas...
    Je me suis orienté vers un tri fusion implémenté en javascript !
    Jvous tiens au jus
    @+

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Points : 537
    Points
    537
    Par défaut
    Montre-nous déjà comment tu t'y es pris, qu'on comprenne pourquoi ça ne marche pas.

  13. #13
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    En fait si ca ne marche pas c'est parceque j'ai des liens à mettre à jour en fonction soit d'un id_rappel soit d'un id_rdv.
    Et en utilisant ta technique, l'id_rappel était interprété comme un id_rdv....

    Par conséquent j'ai monté une espèce d'usine à gaz qui :

    • récupère les données de mes 2 requetes ;
    • créée 2 dates unix (millisecondes depuis le 1er janvier 1970) ;
    • Les compare ;
    • Puis ajoute dans le tableau events suivant le cas (Rappel ou Rdv)

    Pour ceux que ca interesse voici le code en cours de modification pour éviter les redondances de code :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    $db = new DB();
    $rdvs = $db->query("SELECT * FROM rendez_vous ORDER BY date,heure");
    $rappels = $db->query("SELECT * FROM rappels WHERE assigned_to='".$_SESSION['id_user']."' ORDER BY date,heure");
     
    $events = "" ;
    $event_id = 1 ;
    $nb_events = mysql_num_rows($rdvs);
    $nb_rappels = mysql_num_rows($rappels);
    $nb = $nb_events + $nb_rappels ;
     
    $rdv = mysql_fetch_array($rdvs);
    $rappel = mysql_fetch_array($rappels);
     
    for($i = 0 ; $i < $nb ; $i++)
    {
        $date_rdv = strtotime($rdv['date']." ".$rdv['heure']);
        $date_rappel = strtotime($rappel['date']." ".$rappel['heure']);
     
        if(!empty($date_rdv) && !empty($date_rappel))
        {
            if($date_rappel < $date_rdv )
            {
                // Ajout rappel
                $annee = substr($rappel['date'],0,4) ;
                $mois = substr($rappel['date'],5,2)-1 ;
                $jour = substr($rappel['date'],8,2)-1+1;
                $title = substr($rappel['heure'],0,5)." - ".$rappel['titre'] ;
                $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_rappel.php?id_event=".$rappel['id_rappel']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_rappel.php?id_event=".$rappel['id_rappel']."\",\"del_URL\": \"includes/content/accueil/popup/delete_rappel.php?id_event=".$rappel['id_rappel']."\", \"CssClass\":\"Remind\" }" ;
                if($event_id!=$nb)
                    $events .= ",";
                $event_id++ ;
                $rappel = mysql_fetch_array($rappels);
            }
            elseif($date_rappel == $date_rdv)
            {
                // ajout rappel
                $annee = substr($rappel['date'],0,4) ;
                $mois = substr($rappel['date'],5,2)-1 ;
                $jour = substr($rappel['date'],8,2)-1+1;
                $title = substr($rappel['heure'],0,5)." - ".$rappel['titre'] ;
                $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_rappel.php?id_event=".$rappel['id_rappel']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_rappel.php?id_event=".$rappel['id_rappel']."\",\"del_URL\": \"includes/content/accueil/popup/delete_rappel.php?id_event=".$rappel['id_rappel']."\", \"CssClass\":\"Remind\" }" ;
                if($event_id!=$nb)
                    $events .= ",";
                $event_id++ ;
                $rappel = mysql_fetch_array($rappels);
     
                // Ajout rdv
                $annee = substr($rdv['date'],0,4) ;
                $mois = substr($rdv['date'],5,2)-1 ;
                $jour = substr($rdv['date'],8,2)-1+1;
                $title = substr($rdv['heure'],0,5)." - ".$rdv['ville'] ;
                $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_event.php?id_event=".$rdv['id_rdv']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_event.php?id_event=".$rdv['id_rdv']."\",\"del_URL\": \"includes/content/accueil/popup/delete_event.php?id_event=".$rdv['id_rdv']."\", \"CssClass\":\"Event\" }" ;
                if($event_id!=$nb)
                    $events .= ",";
                $event_id++ ;
                $rdv = mysql_fetch_array($rdv);
            }
            else
            {
                // Ajout rdv
                $annee = substr($rdv['date'],0,4) ;
                $mois = substr($rdv['date'],5,2)-1 ;
                $jour = substr($rdv['date'],8,2)-1+1;
                $title = substr($rdv['heure'],0,5)." - ".$rdv['ville'] ;
                $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_event.php?id_event=".$rdv['id_rdv']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_event.php?id_event=".$rdv['id_rdv']."\",\"del_URL\": \"includes/content/accueil/popup/delete_event.php?id_event=".$rdv['id_rdv']."\", \"CssClass\":\"Event\" }" ;
                if($event_id!=$nb)
                    $events .= ",";
                $event_id++ ;
                $rdv = mysql_fetch_array($rdvs);
            }
        }
        elseif(empty($date_rdv) && !empty($date_rappel))
        {
            // Ajout rappel
            $annee = substr($rappel['date'],0,4) ;
            $mois = substr($rappel['date'],5,2)-1 ;
            $jour = substr($rappel['date'],8,2)-1+1;
            $title = substr($rappel['heure'],0,5)." - ".$rappel['titre'] ;
            $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_rappel.php?id_event=".$rappel['id_rappel']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_rappel.php?id_event=".$rappel['id_rappel']."\",\"del_URL\": \"includes/content/accueil/popup/delete_rappel.php?id_event=".$rappel['id_rappel']."\", \"CssClass\":\"Remind\" }" ;
            if($event_id!=$nb)
                $events .= ",";
            $event_id++ ;
            $rappel = mysql_fetch_array($rappels);
        }
        elseif(!empty($date_rdv) && empty($date_rappel))
        {
            // Ajout rdv
            $annee = substr($rdv['date'],0,4) ;
            $mois = substr($rdv['date'],5,2)-1 ;
            $jour = substr($rdv['date'],8,2)-1+1;
            $title = substr($rdv['heure'],0,5)." - ".$rdv['ville'] ;
            $events .= "{ \"EventID\":\"".$event_id."\", \"Date\": new Date(".$annee.",".$mois.",".$jour."), \"Title\":\"".$title."\", \"view_URL\": \"includes/content/accueil/popup/view_event.php?id_event=".$rdv['id_rdv']."\",\"edit_URL\": \"includes/content/accueil/popup/edit_event.php?id_event=".$rdv['id_rdv']."\",\"del_URL\": \"includes/content/accueil/popup/delete_event.php?id_event=".$rdv['id_rdv']."\", \"CssClass\":\"Event\" }" ;
            if($event_id!=$nb)
                $events .= ",";
            $event_id++ ;
            $rdv = mysql_fetch_array($rdvs);
        }
    }
    Merci à tous pour votre aide !

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

Discussions similaires

  1. Tri avec sort par date et heure
    Par oumokhtar dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 08/09/2009, 01h22
  2. Pb pour Ordonner par date
    Par Nadaa dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/08/2007, 11h52
  3. Treeset : objets ordonnés par date
    Par michaelbob dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/12/2006, 15h13
  4. la date et heure sur mon formulaire
    Par azde7015 dans le forum Access
    Réponses: 11
    Dernier message: 07/02/2006, 10h40
  5. classer par date les resultats de 2 tables avec UNION
    Par dgedge dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/06/2005, 19h23

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