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 :

Récuperer seulement un enregistrement d'une sous requête


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Récuperer seulement un enregistrement d'une sous requête
    Bonjour à tous,

    Voilà mon problème :
    J'ai une table qui contient un enregistrement pour chaque connexion/déconnexion des utilisateurs.
    Les champs de cette table, en gros :
    source_id (l'id de l'utilisateur)
    movement_date (date de connexion)
    movement_time (heure de connexion)
    movement_type (ici, c'est 7 car je ne veux que les connexions).

    Je veux récuperer via une requete sql les utilisateurs qui se sont connectés x fois avec leur date et heure de dernière connexion.
    J'ai donc fait la requete (qui fonctionne bien) suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT source_id, count(*) as nb WHERE (movement_type_id='7') GROUP BY source_id having count (*) >'5'
    Vous l'aurez compris, ici mon x (nombre de fois que les gens se sont connectés) est égal à 5.
    Seulement ça ça me donne seulement ceux l'id de ceux qui se sont connectés x fois mais pas la date ni heure de leur dernière connexion. Alors j'ai modifié ma requête en ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT source_id, count(*) as nb, movement_date FROM movements WHERE (movement_type_id='7') GROUP BY source_id, movement_date, movement_time having count (*) >'5'
    Mais là, vu qu'il y a plusieurs movement_date, ça ne marche pas. En fait si je mets >'0' à la fin ça me retourne tous ceux qui ne se sont connectés qu'une fois donc je pense que le problème vient du fait que dès que c'est supérieur à 1, il y a au moins 2 résultats pour le champ "movement_date" et du coup ça ne marche pas.
    J'aimerais savoir comment récupérer le "movement_date" le plus récent lorsqu'il y en a plusieurs
    Merci d'avance à tous !

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour , essaye de rajouter à ta requete

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    Oui j'ai vu ça en cherchant un peu sur google avant de poster mais ça ne marche pas non plus. Dès que j'ai plusieurs enregistrements, (donc lorsque je veux ceux qui se sont connectés plusieurs fois) ça ne retourne plus aucun résultat. A moins que je ne le mette pas au bon endroit

    Edit : Oui, je confirme lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT source_id, count(*) as nb, movement_date FROM movements WHERE movement_date = (SELECT movement_date FROM movements order by movement_date limit 1) AND (movement_type_id='7') GROUP BY source_id, movement_date, movement_time having count (*) >'0'
    Je n'ai que ceux qui se sont connecté qu'une fois alors que en supérieur à zéro il y en a qui se sont connectés 2 ou 3 fois...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Bon j'ai essayé divers trucs mais soit j'ai des erreurs de syntaxe soit ça ne m'affiche que ceux qui ne se sont connectés qu'une fois...
    Je sèche là !
    Quelqu'un pourrait m'aider?

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonsoir essaye ça (il ya peut etre plus simple et mieux optimisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.source_id ,b.date,count(0) from (select source_id from movements  where movement_type_id=7) a  join 
    (select source_id ,max(date) as date from movements  where movement_type_id=7 group by source_id)b
    on a.source_id=b.source_id group by a.source_id ,b.date having count(0)>X
    pour simplifier j'ai mis un seul champs date et il faudra donc revoir la fonction max (trouver equivalent pour des données de type date)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    Merci ça marche pas trop mal
    J'ai par contre essayé de récupérer en plus, le champ "time" mais selon où je tente de le récupérer soit j'ai une errreur soit je n'ai plus aucun résultat...

    Sinon cette requête fonctionne aussi plus ou moins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT B.source_id, A.DERDATE, count(B.*) AS nb 
      FROM  
    (SELECT source_id, max(movement_date) AS DERDATE 
        FROM movements GROUP BY source_id) A, movements B 
    WHERE A.source_id = B.source_id AND A.DERDATE = B.movement_date AND movement_type_id='7'
    GROUP BY B.source_id, A.DERDATE"
    Mais même problème pour récupérer l'heure... Et en plus le nombre de connexions est parfois faux avec cette requête.

    Donc je vais utiliser celle que tu m'as donné en essayant de récupérer l'heure.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Mouais je n'arrive vraiment pas à récupérer l'heure sans provoquer d'erreurs sql...
    Ca ne doit pourtant pas être compliqué...
    Si quelqu'un y arrive (en particulier xavier-Pierre qui m'a déjà bien aidé ), ça m'aiderait bien

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    dans la requete remplace max (date) par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(movement_date+movement_time)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Ah oui bien vu!
    J'essayais de le mettre dans les select moi mais là du coup si l'utilisateur s'est connecté plusieurs fois dans le même journée on a l'heure de la dernière connexion aussi, c'est cool !
    Par contre, dans la table le champ time est de type "character varying" et non de type "date" ou "time" (d'ailleurs c'est plutôt mal fait ça mais bon je ne peux pas me permettre de le changer...), donc je pense que pour faire une addition je dois forcer le type de ce champ ou le convertir avant de l'additionner non?
    Je vais essayer de regarder dans la doc pour voir ce qu'il y a pour forcer un type...
    Merci en tout cas pour ton aide !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    En fait je me demande si je vais vraiment convertir le champ texte (qui contient l'heure) en champ de type date ou heure car en fait je récupère toutes ces données de ma table movement pour les inserer dans une autre table dans laquelle le champ heure est aussi un character varying donc la conversion ne sert à rien...
    Mais si je ne le convertis pas, je ne peus pas faire max(date+heure) car on ne peut additionner une date et une variable de type texte...
    Donc retour à mon problème précédent : comment récupérer l'heure en modifiant la requête donnée quelsques posts ci-dessus par Xavier-Pierre?

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    si ton heure est de lla forme 00:00:00 tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(movement_date+movement_time::time)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Nickel, ce coup-ci c'est top !
    Il me reste plus qu'à diviser la variable date pour récupérer séparément la date et l'heure mais ça je le ferai en Php donc ça devrait aller...
    Merci bien, tu m'as beaucoup aidé Xavier-Pierre!

Discussions similaires

  1. [Hibernate]Traduire une sous requète en criteria?
    Par djodjo dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/06/2006, 13h53
  2. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50
  3. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54
  4. Insérer plusieurs enregistrements en une seule requête
    Par pyd001 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/02/2004, 10h38
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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