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

Langage PHP Discussion :

Jointure besoin d'aide


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Par défaut Jointure besoin d'aide
    Hello à tous, newbie du join j'aurai besoin de votre aide, je prends un exemple fictif.

    J'ai un table post et une table commentaire

    Dans commentaire on a un champs "idPost" car la personne peut réagir à un post, comme un forum.

    Comment feriez vous pour afficher tous les posts déjà par ordre de publication MAIS en faisant passer en premier ceux dont les commentaires sont les plus récents ? Je me casse les dents et n'y arrive absolument pas...

    Merci par avance, si quelqu'un m'écrit une solution je suis aussi preneur du "raisonnement" pour arriver à me faire à cette logique.

    Exemple architecture :

    POST : id - date - titre - texte
    COMMENTAIRE : id - idPost - date - texte

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select p.id, p.date, p.titre, p.texte, c.id, c.idPost, c.date, c.texte, 
    case when c.date is null , p.date else c.date end as date_last_modif
    from post p
    left join commentaire c on c.idPost = p.idPost
     
    order by p.id , date_last_modif desc


    Devrait afficher tous tes posts et commentaires par ordre décroissant de la dernière modification.

    Par contre, les nom de champs devraient être tous en minuscule.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 25
    Par défaut
    Merci beaucoup pour cette piste, j'ai eu du mal à tout comprendre mais en servant de cette base et après moult recherches voici la requête qui a fait exactement ce que je voulais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select p.idMembre as idMembre, p.id as idPost, p.heure as heurePost, p.vues as nombreVues, p.date as datePost, p.titre as titrePost, c.id as idCommentaire, c.idPost as idPostCommentaire, c.date as dateCommentaire, 
    case when c.date is null then p.date else c.date end as date_last_modif,
    case when c.heure is null then p.heure else c.heure end as time_last_modif
    from forumPost p
    left join forumReponse c on c.idPost = p.id
    order by date_last_modif desc, time_last_modif desc, p.id desc

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Comme la coloration syntaxique te l'indique, date est un mot réservé en SQL (puisqu'un type). Il aurait mieux valu mettre date_p et date_c.

    Par ailleurs, as-tu compris la différence entre left join et inner join?

    Dans ton cas, tu pars de la table post, avec des commentaires facultatifs et tu établis la colonne de jointure.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from post p
    left join commentaire c on p.id=c.post_id

    te fait remonter TOUS les posts, avec ou sans commentaire, et si commentaire, te donne les infos.

    Inversement, si, mettons, un post a TOUJOURS un auteur, cela donnera ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from post p
    inner join auteur a on p.auteur_id=a.id

    Pour information, si tu mets join tout court en mysql, cela équivaut par défaut à "inner join", mais il est plus clair de l'écrire en toutes lettres, pour ne jamais l'oublier.

    PS : je te recommande pour travailler proprement, via ton phpmyadmin, de poser le moteur de SGBD qui s'appelle InnoDB, (il est probablement par défaut), et de prendre ta table commentaire, vue structure, et de cliquer sur "gestion des relations" et de poser dans la DB ta clé étrangère. Tu cliques sur post_id, et tu mets que cela correspond à ta table post, champ id, et tu mets tout en cascade.
    Et tu fais de même pour toute table qui de fait, doit posséder une clé étrangère (la table fille si tu veux).

    Le jour où dans l'autre sens, tu supprimes (via ton code ou via PHPmyadmin) un post, cela supprimera automatiquement tous les commentaires liés à ce post qui n'existe plus. Donc tout restera propre.
    Ca t'évitera de coder en PHP la suppression de toutes les tables rattachées à ta table post. Si tu as posé dans la base toutes tes clés étrangères, il te suffira de mettre
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM post WHERE id = 15; /*et tous les commentaires DE CE POST seront éliminés en cascade*/
    DELETE FROM auteur WHERE id = 228; /*et tous les posts et les commentaires DE CET AUTEUR seront éliminés en cascade*/

    Une dernière information, pas (encore ?) disponible en Mysql...
    Dans d'autres technologies de DB, si tu as bien posé toutes tes clés étrangères dans ta base, tu peux te contenter de ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from post p
    natural join commentaire c /*et ça retrouve tout seul la bonne jointure, comme un inner join, et ça évite la redondance*/
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut
    Je suis surpris par ton ordre de tri:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    order by date_last_modif desc, time_last_modif desc, p.id desc

    Soit un ordre de tri sur la date et l'heure puis sur l'id du post.

    Si tu as des post qui sont édités à la même heure (par des users différents) et des commentaires qui s'entremêlent, je pense que ton tri ne sera pas correct. Sur un gros site, par exemple, il n'est pas impossible d'avoir plusieurs enregistrements créés simultanément.
    Du coup, imaginons :
    P1 et P2 créés au même moment et tous les deux avec des commentaires, il me semble que ton tri pourrait retourner

    P1 - C1
    P1 - C2
    P2 - C3 // le second post s'intercale subrepticement
    P1 - C4
    P2 - C5


    Par contre, si l'ordre de tri commence par le post parent, tout rentre dans l'ordre.
    A noter que comme tu notes la date ET l'heure , le tri doit également en tenir compte.

    Je propose donc :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    order by  p.id desc, date_last_modif desc, time_last_modif desc

Discussions similaires

  1. Besoin d'aide pour une jointure SQL complexe
    Par Naruto-uzumaki dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/02/2008, 16h58
  2. Besoin d'aide pour une jointure svp
    Par plex dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2007, 14h27
  3. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 19h23
  4. besoin d'aide pour une jointure avec une exclusion
    Par manu_71 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/02/2007, 12h22
  5. Besoin d'aide pour des jointures de tables
    Par supersmoos dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/12/2006, 16h38

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