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 :

Récuperation valeurs min des catégories à la date la plus récente de chacune des catégories


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut Récuperation valeurs min des catégories à la date la plus récente de chacune des catégories
    Bonjour,

    Ma requête est un peu compliqué, pour moi.

    J'ai 4 tables (que je simplifie volontairement):

    valeur
    -id
    -valeur
    -id_element
    -id_user
    -id_categorie
    date

    element
    -id
    -nom
    -valide

    categorie
    -id
    -nom
    -valide

    user
    -id
    -nom
    -level
    Ce que je souhaite faire c'est récupérer la valeur la plus basse à la dernière date de chaque categorie pour un élément et un type d'utilisateur.

    Sachant qu'il faut que je récupère l'id_user, id_element_ id_categorie.

    Voila la requète que j'ai faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
    FROM valeur v JOIN element e ON ( v.id_element = v.id)
    JOIN user u ON (v.id_user = u.id)
    JOIN categorie c ON (v.id_categorie = c.id)
    WHERE v.valide = 1 AND e.valide = 1 AND c.valide = 1
    ORDER BY e.id, c.id, v.date DESC, v.prix
    Cette requete ne trie pas pour l'instant en fonction de la derniere date connue et valide de chaque categorie.
    Pour bien comprendre ce que je veux, il faut regarder le ORDER BY, ma requette me retourne plein de ligne, et je veux seulement la premiere ligne du groupe e.id, c.id

    Si quelqu'un avait une piste ce serait génial

  2. #2
    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 : 72
    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 zulot Voir le message
    Si quelqu'un avait une piste ce serait génial
    Saluton,
    Une piste

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    J'avais effectivement lu cette source.

    Mon problème étant que je cherche à rapatrier les valeurs qui dépendent des éléments qui eux meme dépendent des catégories.

    Du coup je suis pas arrivé à adapter la source.
    Je vais essayer de la réadapter.

    imaginons je ramene les elements de la source à mes valeurs et la categories a mes elements, j'arrive pas a voir comment je fais pour recupérer à la fois la valeur ayant la valeur minimal à la date la plus recente !
    (A moins de mettre un order peut etre)

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    la valeur la plus basse à la dernière date de chaque categorie pour un élément et un type d'utilisateur
    Dernière date de chaque catégorie pour chaque élément et chaque utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_user, id_element, id_catégorie, MAX(`date`) AS derniere_date
    FROM valeur
    GROUP BY id_user, id_element, id_categorie
    Valeur la plus basse de la dernière date de chaque catégorie pour chaque élément et chaque utilisateur :
    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
    SELECT v.id_user, v.id_element, v.id_categorie, tmp.derniere_date, MIN(v.valeur) AS valeur_mini
    FROM valeur AS v
    INNER JOIN (
        SELECT id_user, id_element, id_catégorie, MAX(`date`) AS derniere_date
        FROM valeur
        WHERE valide = 1
        GROUP BY id_user, id_element, id_categorie
    ) AS tmp 
        ON tmp.id_user = v.id_user
        AND tmp.id_element = v.id_element
        AND tmp.id_categorie = v.id_categorie
        AND tmp.derniere_date = v.`date`
    WHERE v.valide = 1
    GROUP BY v.id_user, v.id_element, v.id_categorie, tmp.derniere_date
    ORDER BY v.id_user, v.id_element, v.id_categorie, tmp.derniere_date

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    je vérifie !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    J'ai modifié ta requete parceque je me suis sans doute mal exprimé sur ce point :
    Dernière date de chaque catégorie pour chaque élément et chaque utilisateur :
    Ou je voulais
    Derniere date de chaque catégorie pour chaque élément
    Mais c'est pas trop important.

    Ce qui m'embete c'est le résultat :
    voici la requete que j'ai fais :
    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
     
    SELECT v.id_user, v.id_element, v.id_categorie, tmp.derniere_date, MIN(v.valeur) AS valeur_mini
    FROM valeur AS v
    INNER JOIN (
        SELECT id_user, id_element, id_categorie, MAX(`date`) AS derniere_date
        FROM valeur
        WHERE valide = 1
        GROUP BY id_element, id_categorie
    ) AS tmp 
        ON tmp.id_element = v.id_element
        AND tmp.id_categorie = v.id_categorie
        AND tmp.derniere_date = v.`date`
    WHERE v.valide = 1
    GROUP BY v.id_element, v.id_categorie, tmp.derniere_date
    ORDER BY v.id_element, v.id_categorie, tmp.derniere_date
    J'ai renseigné ma table avec quelques lignes
    Une des lignes qui devrait m'être renvoyé est :
    id_user = 5
    id_element = 1
    id_categorie = 1
    date = 2010-12-02
    valeur = 10
    Et la la requête se mélange dans l'id_user, car elle me retourne ca :
    id_user = 1
    id_element = 1
    id_categorie = 1
    date = 2010-12-02
    valeur = 10
    id_user = 1 différent de 5 !

    Du coup pour faire le reste de ma requête qui consiste à filtrer en fonction du niveau de l'utilisateur et bien c'est pas bon.

    En tout cas un grand merci aux modérateurs qui essayent de m'aider

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Un SGBD ne fait que ce qu'on lui demande !

    Ma requête donne la valeur mini de la dernière date de chaque catégorie de chaque élément de chaque utilisateur.
    Si ce n'est pas ce que tu veux, il faut mieux préciser ton besoin en donnant un petit jeu de données (et pas une seule ligne ! ) et le résultat attendu.

    J'avais remarqué une certaine ambiguïté entre le besoin exprimé par le titre de la discussion et le message.

    Dans tous les cas, quand tu es face à un problème complexe, découpe-le en problèmes plus simples. Un certain Descartes a écrit à peu près la même chose il y a près de 4 siècles !
    Tu pourras ainsi construire ta requête progressivement, comme je l'ai fait dans mon précédent message, en vérifiant chaque étape.

    Si tu veux :
    Derniere date de chaque catégorie pour chaque élément
    Il suffit de supprimer id_utilisateur du GROUP BY de la sous-requête et peut-être d'inverser l'ordre des colonnes id_categorie et id_element. Idem pour la requête principale.

    Bref, lis la phrase en bleu de ma signature et appliques-en le principe !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    Oui un SGBD ne fait que ce qu'on lui demande, mais je n'ai pas la ligne
    id_user = 1
    id_element = 1
    id_categorie = 1
    date = 2010-12-02
    valeur = 10
    Dans mon jeux de données mais

    id_user = 5
    id_element = 1
    id_categorie = 1
    date = 2010-12-02
    valeur = 10
    Je vais essayer ce soir de faire un jeux de donner et de le mettre ici, et de préciser mon besoin qui est difficile car chaque contrainte est en fonction de plusieurs table.
    Exemple :
    Pour la date MAX elle doit être valide, a savoir qu'on ne prend en compte que les dates des valaurs valide, pour des elements valide et des categorie valide et des user d'un level identifié et ce pour chacune des catégories
    Ensuite une fois qu'on a cette date pour chacune des categories on doit récupérer la valeur min valide (meme sens que pour la date) à cette date pour chacune des catégories.

    Et c'est la que je coince et que le group by user fait que l'id n'est pas bonne (dans ma requete comme dans la tienne)

    En tout cas merci de ton aide

Discussions similaires

  1. [AC-2007] Récupérer des données en fonction de date la plus récente
    Par m6riil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/04/2013, 21h42
  2. Réponses: 5
    Dernier message: 10/11/2011, 09h58
  3. Réponses: 2
    Dernier message: 27/07/2011, 14h34
  4. Réponses: 1
    Dernier message: 17/05/2011, 11h29
  5. Réponses: 8
    Dernier message: 12/11/2008, 18h07

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