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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    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 émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    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 averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    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 émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    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 averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 40
    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.

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