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 :

Prob visibilité dans un select


Sujet :

Requêtes PostgreSQL

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 11
    Points
    11
    Par défaut Prob visibilité dans un select
    Bonjour à tous, voilà mon problème.
    Je veux dans une requête pouvoir faire plusieurs count different avec jointure, j'ai donc choisi de faire un SELECT dans mes jointures mais je suis bloqué à ce niveau là.


    exemple de ce qui bloque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1.id, nb FROM table1 t1 
         JOIN table2 t2 ON (t1.id=t2.id)
         LEFT JOIN 
               (SELECT id, count(id) AS nb FROM table3 WHERE t2.date=date GROUP BY id)
               t3 ON (t1.id=t3.id)
    Le problème est donc que t2 n'est pas visible dans le second SELECT, mais je ne trouve pas la solution pour contourner le problème...

    (Je veux dans l'exemple récupérer le nombre d'entrée dans la table3 pour la date t2.date)

    Merci d'avance pour le coup de main

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    t2.date=date est apparemment une condition de jointure. Dans ce cas pourquoi la mettre dans le WHERE de t3 au lieu de la mettre dans le ON (...) du JOIN?

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Si j'ai bien compris, tu proposes de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.id, nb FROM table1 t1 
         JOIN table2 t2 ON (t1.id=t2.id)
         LEFT JOIN 
               (SELECT id, count(id) AS nb FROM table3 GROUP BY id)
               t3 ON (t1.id=t3.id AND t2.date=t3.date)
    Malheureusement dans ce cas là la date de t3 n'existe pas car je ne la récupère pas dans le select de plus mon count(id) va faire un count de tte les entrées pour ttes les dates de id, mais je ne veux le count des id que pour une date présente dans t2 (Je sais pas trop si je suis clair..^^)

    Pour que la requete marche je dois rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            (SELECT id, date, count(id) AS nb FROM table3 GROUP BY id, date)
    Mais dans ce cas là ce que me retourne le select n'est plus utilisable (car group by date)

    Je me trompe peut être mais en tout cas pour le moment le résultat n'est pas bon ^^ Je suis un peu perdu désolé !

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par saturne77 Voir le message
    Pour que la requete marche je dois rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            (SELECT id, date, count(id) AS nb FROM table3 GROUP BY id, date)
    Mais dans ce cas là ce que me retourne le select n'est plus utilisable (car group by date)
    Il s'agit juste de décaler le moment dans l'exécution où les dates sont filtrées pour ne garder que celles qui correspondent à des entrées de t2. Ca ne doit pas rendre le résultat inutilisable. Mais l'ordre du GROUP BY me parait illogique. Il ne faudrait pas plutôt grouper d'abord par date, puis par id dans la sous-requête ci-dessus?

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Lorsque je change l'ordre ma requête me retourne plusieurs résultat par id >< alors que je cherche à en avoir que un seul par id.

    Parce que je suis un peu perdu j'ai voulu repartir sur une base de qqch qui marche. Voilà un bout de code qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.id, count(t3.date) FROM table1 t1
    	JOIN table2 t2 ON (t2.id=t1.id)
    	LEFT OUTER JOIN table3 t3 ON (t3.id = t1.id AND date(t2.date) = date(t3.date))
    GROUP BY t1.id
    ORDER BY t1.id
    Malheureusement si je veux faire plusieurs count et join je ne peux plus utiliser cette méthode... C'est pour cela que je me suis mis à chercher du côté du SELECT dans le JOIN. Mais bon, pour le moment je suis toujours dans le mur !

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Tu n'aurais pas un jeu d'essai sous la main? Avec les valeurs de départ des tables et les résultats souhaités pour la requête, il sera peut-être plus simple de trouver le chemin entre les deux

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Voilà un exemple j'ai essayé de le faire simple et compréhensible ! Désolé si c'est raté ^^

    Table1

    id

    1
    2
    4
    5
    6
    8
    10

    Table2

    id date

    1 2010-10-05
    2 2010-10-06
    3 2010-10-07
    4 2010-10-05
    5 2010-10-04
    6 2010-10-05
    7 2010-10-06
    8 2010-10-08
    9 2010-10-02
    10 2010-10-03

    Table3

    id creation

    1 2010-10-05
    2 2010-10-05
    2 2010-10-06
    2 2010-10-06
    8 2010-10-08
    10 2010-10-08
    11 2010-10-09

    Je veux donc avoir le nombre de creation des id de la table1, à la date inscrite dans table2.

    Là en gros je voudrais obtenir :
    Pour 1 il y a eu 1 création le 2010-10-05
    Pour 2 il y a eu 2 création le 2010-10-06
    Pour 8 il y a eu 1 creation le 2010-10-08

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.id, count(t3.creation) FROM table1 t1
    JOIN table2 t2 ON (t2.id = t1.id)
    LEFT OUTER JOIN table3 t3 ON (t3.id=t1.id AND t3.creation=t2.date)
    GROUP BY t1.id
    ORDER BY t1.id
    Cette requête retourne le résultat souhaité, mais je reviens à mon problème de plusieurs jointure et count qui ne me retourne plus le bon résultat

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    La requête suivante revoie bien le résultat que tu sembles attendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.id, count(t3.*) 
    FROM table1 t1
    INNER JOIN table2 t2 ON (t2.id=t1.id)
    LEFT OUTER JOIN table3 t3 ON t3.id = t1.id AND t2.date2 = t3.creation
    GROUP BY t1.id
    ORDER BY t1.id
    Si tu ne veux pas des lignes pour lequel le count vaut 0, alors remplace la jointure à gauche (LEFT OUTER JOIN) par une jointure interne (INNER JOIN).

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. formater un champ date dans un select
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/04/2006, 16h44
  2. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  3. Joindre une valeur arbitraire dans un SELECT
    Par Tuxxy dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/01/2004, 17h04
  4. Réponses: 3
    Dernier message: 23/09/2003, 09h12
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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