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 :

Requête SQL sur deux tables & ORDER BY


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut Requête SQL sur deux tables & ORDER BY
    Bonsoir à tous,

    J'ai dans ma BDD deux tables :

    Table "events" :
    • id
    • body
    • timestamp
    • timereel (date du post en timestamp)
    • auteur
    • titre
    • ...


    et table "comments" :

    • id
    • id_event
    • ladate (date du post en timestamp)
    • auteur
    • commentaire


    J'aimerai (tout simplement) récupérer tous les champs de chaque tables, mais dans un ordre chronologique. Le plus récent d'abord et le moins à la fin.
    Pour récupérer les infos de "events" je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lesEvents = mysql_query("SELECT id, body, auteur, titre, timestamp, timereel, ... FROM events ORDER BY timereel DESC", $conncal);
    et les infos comments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $eventCom = mysql_query("SELECT id, ladate, auteur, commentaire FROM comments WHERE id_event='$e_id' ORDER BY ladate ASC", $conncal);
    Voilà, comment afficher donc ces champs selon leur date, comme si ils n'appartenaient qu'a la même table avec un seul champ timestamp en fait,

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    On ne peux pas multiplier des pommes par des bananes, et il faut donc passer par untableau temporaire et un tri via PHP.

    donc 1er chose, met toi un alias dans tes 2 requêtes de façon à ce que ton timestamp ai le même nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lesEvents = mysql_query("SELECT id, body, auteur, titre, timestamp as d, timereel, ... FROM events ORDER BY timereel DESC", $conncal);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $eventCom = mysql_query("SELECT id, ladate as d, auteur, commentaire FROM comments WHERE id_event='$e_id' ORDER BY ladate ASC", $conncal);
    Etape 2, rempli un tableau avec tes résultats...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tmp = array();
    while($res = mysql_fetch_assoc($eventCom))
       $tmp[] = $res;
    while($res = mysql_fetch_assoc($lesEvents ))
       $tmp[] = $res;
    Etape 3, définir une fonction de tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Trier(& $a, & $b) {return $a['d'] > $b['d'] ? -1 : 1;} // ou < à la place de > si c'est pas dans le bon ordre...
    Enfin, faire un tri avec callback de cette fonction

    Et $tmp contient ainsi ton tableau avec des bananes et des pommes triés par date !

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu peux tout récupérer en une seule passe :
    Code sql : 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
    SELECT 
        e.id, 
        e.body, 
        e.auteur, 
        e.titre, 
        e.timestamp, 
        e.timereel, 
        ... ,
        c.id, 
        c.ladate, 
        c.auteur, 
        c.commentaire
    FROM 
        events e
        LEFT JOIN comments c ON e.id = c.id_event
    ORDER BY
        e.timereel DESC,
        c.ladate ASC

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponses, mais ce n'est pas exactement ce que je veux.

    Je sais pas trop comment expliquer, parce que du coup je récupère plusieurs commentaires pour chaque évènement avec ta requête sql.

    Moi j'aimerai en fait une page, ou je vois tous les messages affichés que ce soit dans "events" ou dans "comments" une seule fois, selon leur ordre d'arrivée, de la plus récente au plus ancien.

    Exemple :

    Table events :
    id:1
    title:event 1
    timereel:1360000000
    ---------------------
    id:2
    title: event 2
    timereel:1340000000


    Table comments :
    id:1
    id_event:1
    title: comment 1
    ladate:1350000000



    J'aimerai que l'affichage de ma page soit donc :

    • event 1
    • comment 1
    • event 2


    C'est plus compliqué non ?

    Merci

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je ferais quelque chose comme ça :
    Code sql : 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
    (
        SELECT 
            e.id       AS id, 
            e.auteur   AS auteur, 
            e.titre    AS titre,  
            e.timereel AS time_stamp,
            e.body     AS texte
        FROM 
            events e
     
    ) UNION (
     
        SELECT 
            c.id          AS id, 
            c.auteur      AS auteur, 
            ""            AS titre,  
            c.ladate      AS time_stamp,
            c.commentaire AS texte
        FROM 
            comments c
    )
     
    ORDER BY
        time_stamp;

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    J'ai cette erreur :
    #1222 - The used SELECT statements have a different number of columns
    J'ai modifié ta requête, tu avais écrit deux fois events e

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Donne la requête qui provoque l'erreur.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    En fait j'ai trouvé mon erreur j'avais rajouter d'autre champs dans le premier select, parce qu'effectivement, comments et events n'ont pas du tout le même nombre de colonne, et je dois absolument récupérer toutes les infos de chaque table.
    Ta requête fonctionne bien en tout cas ça c'est cool, mais comment récuperer mes 15 champs de events alors que comments n'en a que 5 ?

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En ajouter les colonnes, quitte à envoyer des valeurs vides. Si ta table comments contient une colonne signature par exemple :
    Code sql : 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
    (
        SELECT 
            e.id       AS id, 
            e.auteur   AS auteur, 
            e.titre    AS titre,  
            e.timereel AS time_stamp,
            e.body     AS texte,
            null       AS signature
        FROM 
            events e
     
    ) UNION (
     
        SELECT 
            c.id          AS id, 
            c.auteur      AS auteur, 
            ""            AS titre,  
            c.ladate      AS time_stamp,
            c.commentaire AS texte,
            c.signature   AS signature
        FROM 
            comments c
    )
    Bon évidemment, dans le code ensuite il faut prévoir le cas des colonnes null

  10. #10
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Citation Envoyé par lokomass Voir le message
    Merci pour vos réponses, mais ce n'est pas exactement ce que je veux.

    Je sais pas trop comment expliquer, parce que du coup je récupère plusieurs commentaires pour chaque évènement avec ta requête sql.

    Moi j'aimerai en fait une page, ou je vois tous les messages affichés que ce soit dans "events" ou dans "comments" une seule fois, selon leur ordre d'arrivée, de la plus récente au plus ancien.

    Exemple :

    Table events :
    id:1
    title:event 1
    timereel:1360000000
    ---------------------
    id:2
    title: event 2
    timereel:1340000000


    Table comments :
    id:1
    id_event:1
    title: comment 1
    ladate:1350000000



    J'aimerai que l'affichage de ma page soit donc :

    • event 1
    • comment 1
    • event 2


    C'est plus compliqué non ?

    Merci
    C'est exactement ce que fait la 1er solution que je te donne.
    Tu peux la recopier tel-quel, tu auras un tableau contenant event et comment ordonnés par date ! Après, a l'affichage, il faudra bien sur que tu test a chaque ligne du tableau si c'est un comment ou un event pour avoir la présentation adaptée !

Discussions similaires

  1. Requête SQL sur deux tables
    Par AspiGeek dans le forum Débuter
    Réponses: 5
    Dernier message: 17/03/2010, 19h42
  2. requête sql sur deux tables
    Par canacana dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/02/2010, 18h37
  3. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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