Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 16h50   #1
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
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):

Citation:
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 :
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
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 17h28   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 529
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 529
Points : 3 521
Points : 3 521
Citation:
Envoyé par zulot Voir le message
Si quelqu'un avait une piste ce serait génial
Saluton,
Une piste
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 09h55   #3
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
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)
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h09   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Citation:
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 :
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 :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h38   #5
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
je vérifie !
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h54   #6
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
J'ai modifié ta requete parceque je me suis sans doute mal exprimé sur ce point :
Citation:
Dernière date de chaque catégorie pour chaque élément et chaque utilisateur :
Ou je voulais
Citation:
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 :
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 :
Citation:
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 :
Citation:
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
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h17   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
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 :
Citation:
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 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h44   #8
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

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

Citation:
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
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h53.


 
 
 
 
Partenaires

Hébergement Web