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 MySQL Discussion :

Select avec "date d'un premier élément" dans clause Where


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut Select avec "date d'un premier élément" dans clause Where
    Bonjour à tous,

    j'ai une requéte d'un genre que je n'ai jamais rencontré jusque là à écrire, et je ne sais même pas à quels méchanismes faire appel.

    Table 'user'
    ------------
    id


    Table 'depot'
    --------------
    id
    user_id
    montant
    date


    Et je voudrais récupérer "les utilisateurs qui ont fait leur PREMIER DEPOT entre 2008-01-01 et 2009-01-01 (par exemple).

    Pourriez vous me donner des pistes à suivre pour filtrer avec ce fameux "premier élément" ?

    Merci

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    A quoi peut bien servir la table "user" s'il n'y a qu'un champ id dedans ? oO

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut
    le schéma est minimal pour la lecture, il y a bien plus qu'un identifiant...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Ok donc je suppose que la table user contient les coordonnées pour chaque utilisateur et que le user_id de la table depot correspond à l'id de la table user ?

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je pense à quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d.id,d.user
    FROM depot d
    WHERE d.date BETWEEN '2008-01-01' AND '2009-01-01'
    AND d.date=(SELECT MIN(d2.date) FROM depot d2
                       WHERE d2.id=d1.id)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup, je vais essayer.

    Personnellement j'avais bidouillé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT u.id FROM user u JOIN depot d ON u.id=d.user_id
     
    WHERE d.date>'2008-01-01' IN (SELECT d.id FROM depot d WHERE d.user_id=u.id ORDER BY d.date DESC LIMIT 1)
    Mais ça ne fonctionne pas avec ma version (MySQL 5.0)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut
    Maljuna Kris, ça n'a pas l'air de me sortir les bons résultats.
    Pour tester j'ai regardé les users que ça m'a sorti, et j'ai recherché leur premier dépot dans la table dépot.

    Ça a l'air de plutot retourner "les utilisateurs ayant un depot entre ces 2 dates" non ?

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par adrien357 Voir le message
    Personnellement j'avais bidouillé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT u.id FROM user u JOIN depot d ON u.id=d.user_id
     
    WHERE d.date>'2008-01-01' IN (SELECT d.id FROM depot d WHERE d.user_id=u.id ORDER BY d.date DESC LIMIT 1)
    Mais ça ne fonctionne pas avec ma version (MySQL 5.0)
    Logique, tu as une erreur de syntaxe dans la clause WHERE, en SQL les opérandes ne sont pas transitives et tu dois aliasser la table différemment dans la requête principale et dans la sous-requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE d.date>'2008-01-01' 
    AND d.date IN (SELECT d2.id FROM depot d2 WHERE d2.user_id=u.id ORDER BY d2.date DESC LIMIT 1)
    D'autre part le IN n'est pas trop utile avec LIMIT 1, = convenait tout à fait très bien.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut
    Exact

    Par contre tu m'as bien mis sur la voix avec ton MIN() (tout bete, mais pas pensé )

    Au final j'ai ça, ça me semble fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT u.id FROM user u
    WHERE
    (
    SELECT MIN(d.date) AS premier_depot
    FROM depot d
    WHERE d.user_id=u.id
    GROUP BY d.user_id
    )
    BETWEEN '2008-01-01' AND '2009-01-01';
    Il ne me reste plus qu'a transformer ça en requete à base de Criteria/Criterion !

  10. #10
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Le GROUP BY n'est pas utile puisque tu filtres déjà l'utilisateur dans la clause WHERE

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2013, 12h30
  2. Réponses: 5
    Dernier message: 18/09/2008, 16h02
  3. Pb requête select avec 2 dates
    Par lolymeupy dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/04/2008, 11h15
  4. Select Avec Max(date)
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/08/2006, 18h26
  5. Réponses: 4
    Dernier message: 02/08/2006, 09h42

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