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

PostgreSQL Discussion :

faire une requête sur plusieurs tables


Sujet :

PostgreSQL

  1. #1
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut faire une requête sur plusieurs tables
    Salut,
    Comme le titre l'indique, j'aimerai faire une requête sur deux tables à la fois.
    je suis franchement pas champion en requête.

    Mes deux tables se présentent comme ça :
    champs table "gns" :
    • full_name
    • cc1
    • adm1
    • fc
    • long
    • lat


    champs table us_names
    • feature_name
    • state_alpha_code
    • state_number_code
    • country_number_code
    • primary_longitude_dd
    • primary_latitude_dd


    voici la requête que j'ai essayé :
    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
    SELECT	
    gns.full_name,	
    gns.cc1, 
    gns.adm1, 
    gns.fc, 
    trim(gns.long), 
    trim(gns.lat),
    us_names.feature_name, 
    us_names.state_alpha_code, 
    us_names.state_number_code, 
    us_names.country_number_code, 
    trim(us_names.primary_longitude_DD),
    trim(us_names.primary_latitude_DD)
    FROM gns, us_names
    WHERE gns.full_name, us_names.feature_name
    LIKE 'New York'
    ORDER BY gns.full_name, us_names.feature_names
    Je lance la requête sous phpPgAdmin. Ca tourne un moment, puis rien.
    Avez-vous une idée de ce qui ne convient pas?

    Et puis par curiosité :
    Est ce qu'il vaut mieux faire une requête de ce type (enfin qui fonctionne ) ou alors deux requêtes séparés et ensuite faire un array_merge() ?

    Merci pour vos conseils

  2. #2
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Hello


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE gns.full_name, us_names.feature_name
    LIKE 'New York'
    Cette partie ne peut marcher.
    Dans le WHERE, tu dois mettre les conditions de sélection (ici, tu utilise un 'LIKE'), et/ou les jointures entre les tables, ce que tu ne fais pas.
    Il n'y a pas de lien entre ta table gns et us_names.
    Je *suppose* que le lien se fait sur les champs 'gns.full_name, et us_names.feature_name', il faut transformer cette partie de requete en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE gns.full_name = us_names.feature_name
    AND gns.full_name LIKE 'New York'
    Si ca ne donne pas ce que tu veux, donne les requetes create table, jeux d'essais, et quels sont les champs de jointures, un peu plus de précision en gros
    Je lance la requête sous phpPgAdmin. Ca tourne un moment, puis rien.
    Avez-vous une idée de ce qui ne convient pas?
    normal, pas de jointure entre tes 2 tables = produit cartésien. En gros, tu recopie toutes les lignes de la table de droite ou chaque entrée de la table de gauche (soit nb_lignes(tables1)* nb_lignes(tables2) lignes retournées). Tu déclenche donc probablement le timeout de pgAdmin et/ou la taille max de résultat.
    Et puis par curiosité :
    Est ce qu'il vaut mieux faire une requête de ce type (enfin qui fonctionne ) ou alors deux requêtes séparés et ensuite faire un array_merge() ?
    Le SQL est fait pour ce type d'utilisation. Pas à hésiter, il faut mieux le faire en SQL qu'en quoi que ce soit d'autre.

    plus d'info sur les jointures :
    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  3. #3
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    J'ai une bonne et une mauvaise nouvellle :
    La bonne c'est que la requête marche grâce à tes conseils !

    La mauvaise c'est que c'est pas le résultat que je cherche. J'obtiens un tableau de 96 lignes qui correspond aux produits des deux résultats. je m'explique.

    si j'effectue chaque requête séparement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	
    gns.full_name,	
    gns.cc1, 
    gns.adm1, 
    gns.fc, 
    trim(gns.long), 
    trim(gns.lat)
    FROM gns
    WHERE gns.full_name LIKE 'New York'
    ORDER BY gns.full_name
    donne 12 lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	
    us_names.feature_name, 
    us_names.state_alpha_code, 
    us_names.state_number_code, 
    us_names.country_number_code, 
    trim(us_names.primary_longitude_DD),
    trim(us_names.primary_latitude_DD)
    FROM us_names
    WHERE us_names.feature_name LIKE 'New York'
    ORDER BY us_names.feature_name
    donne 8 lignes

    Si je fais les deux requêtes en une :
    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
    SELECT	
    gns.full_name,	
    gns.cc1, 
    gns.adm1, 
    gns.fc, 
    trim(gns.long), 
    trim(gns.lat),
    us_names.feature_name, 
    us_names.state_alpha_code, 
    us_names.state_number_code, 
    us_names.country_number_code, 
    trim(us_names.primary_longitude_DD),
    trim(us_names.primary_latitude_DD)
    FROM gns, us_names
    WHERE gns.full_name = us_names.feature_name
    AND gns.full_name LIKE 'New York'
    ORDER BY gns.full_name, us_names.feature_name
    alors pour chaque ligne trouvées dans la table us_names, il me repète les douze lignes trouvées dans la table gns.
    8x12 = 96

    En fait, je cherche à sortir tous les enregistrements de la table gns dont full_name LIKE 'New York' (par exemple) et tous les enregistrements de la table de us_names dont feature_name LIKE 'New York'. Soit un total de 20 lignes.

  4. #4
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    En fait, je cherche à sortir tous les enregistrements de la table gns dont full_name LIKE 'New York' (par exemple) et tous les enregistrements de la table de us_names dont feature_name LIKE 'New York'. Soit un total de 20 lignes.
    D'après ce que je comprend :

    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
    SELECT	
    gns.full_name,	
    gns.cc1, 
    gns.adm1, 
    gns.fc, 
    trim(gns.long), 
    trim(gns.lat)
    FROM gns
    WHERE gns.full_name LIKE 'New York'
     
    UNION
    SELECT 
    us_names.feature_name, 
    us_names.state_alpha_code, 
    us_names.state_number_code, 
    us_names.country_number_code, 
    trim(us_names.primary_longitude_DD),
    trim(us_names.primary_latitude_DD)
    FROM us_names
    WHERE us_names.feature_name LIKE 'New York'
     
    ORDER BY gns.full_name,us_names.feature_name
    PS / ton like est inutile ici, car tu n'utilise par de caractères 'spéciaux' tels que %. Ton LIKE équivaut à un '=', qui serait, je pense un peu plus rapide (pas sur, mais dans le doute )

    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  5. #5
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    oui ça marche !
    Merci
    @+
    Julien

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

Discussions similaires

  1. [MySQL-5.6] Faire une requête sur deux tables pour avoir la valeur MAX sans le GROUP BY
    Par emykev22 dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/06/2014, 12h12
  2. Réponses: 22
    Dernier message: 10/07/2011, 17h49
  3. [1.x] Comment faire une recherche sur plusieurs tables
    Par farhaenis dans le forum Symfony
    Réponses: 6
    Dernier message: 01/07/2011, 17h47
  4. Question pour une requête sur plusieurs tables/objets
    Par pontus21 dans le forum Hibernate
    Réponses: 54
    Dernier message: 01/06/2009, 18h37
  5. [vb6]faire une requete sur plusieurs tables
    Par Henry9 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/07/2006, 02h06

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