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

Requêtes PostgreSQL Discussion :

requête join 2 tables


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut requête join 2 tables
    J'ai 2 tables

    table1
    gid_persons gid_publications
    2 45
    3 45
    4 46

    table2
    gid_persons compte_publications
    2 18
    3 22
    4 12


    J'aimerais avoir les personnes qui sont sur les mêmes publications mais en ayant en premier, la personne qui a le plus de publications

    resultat souhaité
    source_personne target_personne compte_ensemble
    3 2 2

    parce que 2 et 3 sont sur la même publication et 3 est la source puisqu'il a 22 publications et sont ami 3 a 18 publications

    Merci, parce que pour moi, c'est pas si simple...

    Martin F

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Qu'as-tu essayé comme requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut essai requête
    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
    SELECT t.gid_persons AS source,
               (
        select t3.count_publications 
        from count_publications_by_persons t3, 
                    count_publications_by_persons t4 
        WHERE t3.count_publications > t4.count_publications
      ) as weight_source,
      t1.gid_persons AS target,
      (
        select t3.count_publications 
        from count_publications_by_persons t3, 
                    count_publications_by_persons t4 
        WHERE t3.count_publications < t4.count_publications
      ) as weight_target,
              t.gid_publications
     FROM personstopublications t,
      personstopublications t1,
            count_publications_by_persons t3,
            count_publications_by_persons t4
     WHERE t1.gid_persons > t.gid_persons 
      AND t.gid_publications = t1.gid_publications;

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quelle horrible requête !
    Tu utilises la syntaxe de jointure obsolète depuis 1992.

    J'aimerais avoir les personnes qui sont sur les mêmes publications mais en ayant en premier, la personne qui a le plus de publications

    resultat souhaité
    source_personne target_personne compte_ensemble
    3 2 2
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p1.gid_publications, 
        p1.gid_persons AS personne_1, 
        c1.compte_publications AS compte_personne_1,
        p2.gid_persons AS personne_2,
        c2.compte_publications AS compte_personne_2
    FROM personstopublications AS p1
    INNER JOIN count_publication_by_persons AS c1 ON c1.gid_persons = p1.gid_persons
    INNER JOIN personstopublications AS p2 ON p2.gid_publications = p1.gid_publications
        INNER JOIN count_publication_by_persons AS c2 ON c2.gid_persons = p2.gid_persons
    WHERE c1.compte_publications > c2.compte_publications
    ORDER BY p1.gid_publication
    Mais peut-être devrais-tu revoir aussi ton modèle de données s'il n'est pas trop tard ; compte_publications est une colonne calculée et, à ce titre, ne devrait pas exister.
    Et quand je vois des colonnes qui s'appellent 'gid_*', je crains que tu utilises un identifiant peu performant, même si tes données semblent indiquer qu'en fait il s'agit d'un banal entier, ce qui bien mieux qu'un GUID.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut view
    en fait, mes deux "tables" sont des vues

    Martin

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Merci
    Merci beaucoup CinePhil, ça fonctionne très bien.
    Je ne baigne pas souvent dans PostGRES ni dans le sql en général.

    Je nomme l'identifiant unique de mes tables "gid" et lorsque j'amène des données dans des vues, je renomme ces gid d'une façon plus explicite, comme "gid_publications".

    D'après ta réaction, ce n'est peut-être pas la bonne façon de faire. Peux-tu me dire en 2 mots comment tu vois ça?
    Merci encore

    Martin F

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par martinfa Voir le message
    en fait, mes deux "tables" sont des vues
    OK, je comprends mieux la présence de la colonne calculée.
    N'as-tu accès qu'à ces vues ou as-tu la main sur la structure de la BDD ?
    Il serait peut-être plus judicieux de créer une vue répondant à ton besoin, directement à partir des tables ?
    Sans la structure de la BDD, difficile de le savoir.

    Citation Envoyé par martinfa Voir le message
    Je nomme l'identifiant unique de mes tables "gid" et lorsque j'amène des données dans des vues, je renomme ces gid d'une façon plus explicite, comme "gid_publications".

    D'après ta réaction, ce n'est peut-être pas la bonne façon de faire.
    Si "gid" n'est qu'un nom mais que cet identifiant est bien un entier généré dans la table d'origine par une séquence (auto-incrémentation), pas de problème.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [AC-2003] Requête join 2 tables
    Par martinfa dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/10/2010, 13h55
  2. [MySQL] Requête sur 4 tables (JOIN)
    Par MrGroar dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 20/07/2010, 15h18
  3. Grosse requête dans plusieurs tables. (JOIN)
    Par Space Cowboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/10/2006, 10h18
  4. Requête sur 2 tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2005, 15h57
  5. Requête sur 2 tables et surtout novice...
    Par kibodio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/03/2005, 15h45

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