Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 16/05/2011, 15h58   #1
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
Par défaut Sélectionner les résultats d'une requête par date

Le titre est pas parlant, pas facile d'expliquer mon problème en quelques mots...

J'ai une table historique qui contient les informations de plusieurs "rampes" à de dates différentes...

une rampe appartient à un "jeu"

De ce fait, une rampe (identifiée par un id) passe plusieurs fois dans l'historique...

Je voudrais sélectionner pour une rampe, son historique le plus récent...

Exemple :

la rampe 1 passe dans l'historique le 04/05
la rampe 2 passe dans l'historique le 05/05

Code :
1
2
3
4
 
SELECT Jeu.idJeu, Historique.IdRampe_Rampe, Historique.TSN, Historique.TSO
FROM Jeu INNER JOIN Historique ON Jeu.idJeu = Historique.idJeu_Jeu 
WHERE Jeu.idJeu ="00201d1"  AND  historique.resultat = "ok" AND Historique.Date=(SELECT max(historique.date) FROM historique);
Cette méthode fonctionne tant que la rampe en question est à la dernière date inséré dans historique, malheureusement si pour une rampe donnée, son dernier historique est plus ancien, la requête ne me sélectionne rien...

Dans l'exemple, si je veux sélectionner la rampe 2, la requête fonctionne, si je veux sélectionner la rampe 1, mon select est vide puisque la dernière date est le 5 et non le 4...

J'ai donc essayer ca :
Code :
1
2
3
4
 
SELECT DISTINCT Historique.IdRampe_Rampe, Historique.TSN, Historique.TSO FROM Jeu INNER JOIN Historique ON Jeu.idJeu = Historique.idJeu_Jeu
WHERE (((Jeu.idJeu)="00201D2") AND ((Historique.Resultat)='ok')) 
ORDER BY Historique.Date DESC;
Sauf que les clauses distinct et order by sont incompatibles...

sans le distinct j'ai des "doublons" (je vois plusieurs fois la même rampe à des date différentes...)

Si vous avez une solution je suis preneur

Cordialement, 0sef
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 16h04   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Voici une méthode qui marche, parmis plusieurs:
Code :
1
2
3
4
5
6
7
 
SELECT Jeu.idJeu, Historique.IdRampe_Rampe, Historique.TSN, Historique.TSO
FROM Jeu
INNER JOIN Historique ON Jeu.idJeu = Historique.idJeu_Jeu 
LEFT OUTER JOIN Historique h2 ON Jeu.idJeu = H2.idJeu_Jeu AND h2.date > historique.date AND h2.resultat = 'OK'
WHERE Jeu.idJeu ="00201d1"
  AND  historique.resultat = "ok" AND h2.idjeu IS NULL
En fait le problème de ta requête est qu'il n'y a pas de lieu entre la table jeu et l'historique de la sous-requête (SELECT max(historique.date) FROM historique).

Tatayo.
tatayo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 16h45   #3
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
Oua merci de la rapidité de la réponse mais... ca fonctionne pas :p

(sans compter le fais que j'ai absolument pas compris ta requête xD)

message que j'obtiens :

"erreur de syntaxe (opérateur absent) dans l'expression 'Jeu.idJeu = Historique.idJeu_Jeu LEFT OUTER JOIN Historique h2 ON Jeu.idJeu = H2.idJeu_Jeu'.
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h06   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
et avec une combinaison HAVING MAX, cela ne fonctionnerait pas ?

Genre

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
	Jeu.idJeu, 
	Historique.IdRampe_Rampe, 
	Historique.TSN, 
	Historique.TSO
FROM 
	Jeu INNER JOIN Historique ON Jeu.idJeu = Historique.idJeu_Jeu 
WHERE 
	Jeu.idJeu ="00201d1"  AND  historique.resultat = "ok"  
GROUP BY 
	Jeu.idJeu, 
	Historique.IdRampe_Rampe, 
	Historique.TSN, 
	Historique.TSO
HAVING 
	Historique.date = max(Historique.date)
A tester et adapter

bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h16   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
bonjour
que donne ceci ?

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT 
    J.idJeu, 
    H.IdRampe_Rampe, 
    H.TSN, 
    H.TSO
FROM Jeu J
INNER JOIN ( --date max pour chaque idJeu
    SELECT idJeu, MAX(date) AS MaxDte
    FROM Historique
    WHERE resultat = 'ok'
    GROUP BY idJeu
)HMax 
    ON J.idJeu = HMax.idJeu
INNER JOIN Historique H 
    ON J.idJeu = H.idJeu_Jeu 
    AND H.date = HMax.MaxDte
WHERE Jeu.idJeu ='00201d1'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h24   #6
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
j'essaye ca demain et je vous tiens au courant en tout cas merci bien :p

sauf que pour ce code :

Citation:
Envoyé par aieeeuuuuu Voir le message
bonjour
que donne ceci ?

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT 
    J.idJeu, 
    H.IdRampe_Rampe, 
    H.TSN, 
    H.TSO
FROM Jeu J
INNER JOIN ( --date max pour chaque idJeu
    SELECT idJeu, MAX(date) AS MaxDte
    FROM Historique
    WHERE resultat = 'ok'
    GROUP BY idJeu
)HMax 
    ON J.idJeu = HMax.idJeu
INNER JOIN Historique H 
    ON J.idJeu = H.idJeu_Jeu 
    AND H.date = HMax.MaxDte
WHERE Jeu.idJeu ='00201d1'
Je ne comprend pas bien quand tu abrège ou pas^^

ca :
J.idJeu,
H.IdRampe_Rampe,

doivent être les abréviations de Jeu.idJeu et Historique.IdRampe_Rampe
mais le "from jeu j" ?
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h40   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
C'est pour aliasser la table.

Cela évite de taper le nom complet à chaque fois.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 08h40   #8
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
tadaa... ^^

Resultat de :
Code :
1
2
3
 
SELECT    J.idJeu,  H.idRampe_Rampe,   H.TSN,   H.TSO  FROM Jeu J INNER JOIN ( SELECT idJeu, MAX(date) AS MaxDte FROM Historique  WHERE resultat = 'ok'  GROUP BY idJeu )  HMax  ON J.idJeu = HMax.idJeu INNER 
JOIN Historique    ON J.idJeu = H.idJeu_Jeu    AND H.date = HMax.MaxDte WHERE Jeu.idJeu ='00201d2'
Erreur : "Erreur de synthaxe (opérateur absent) dans l'expression 'J.idJeu = HMax.idJeu INNER JOIN Historique ON J.idJeu = H.idJeu_Jeu'.

Comprend pas xD
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 09h38   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
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 : 11 001
Points : 18 263
Points : 18 263
Envoyer un message via MSN à CinePhil
Je ne sais pas si le principe de la requête est juste mais en la remettant en forme je constate qu'il manque l'alias de la table Historique dans l'instance après le INNER JOIN.
Ça donnerait ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT J.idJeu, H.idRampe_Rampe, H.TSN, H.TSO  
FROM Jeu J 
INNER JOIN 
( 
    SELECT idJeu, MAX(date) AS MaxDte 
    FROM Historique  
    WHERE resultat = 'ok'  
    GROUP BY idJeu 
)  HMax  ON J.idJeu = HMax.idJeu 
INNER JOIN Historique H 
    ON J.idJeu = H.idJeu_Jeu    
    AND H.date = HMax.MaxDte 
WHERE Jeu.idJeu ='00201d2'
__________________
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 17/05/2011, 10h28   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Vous n'avez pas donné la structure de vos tables, donc on extrapole pour le nom des colonnes...

La colonne idJeu de la table historique change de nom au cours de la requête(idJeu, idJeu_jeu,...).

Remettez l'alias de la pseudo table comme vous l'a dit CinePhil, et vérifiez le nom des colonnes
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h07   #11
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Quel est ton SGBD ?

(S'il fait de la fonction analytique, ça va être tout simple et élégant...)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 11h58   #12
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
Merci à tous... j'ai "contourné le problème" pour l'instant comme ceci :

Code :
1
2
3
4
SELECT DISTINCT Historique.idRampe_Rampe
FROM historique
WHERE historique.resultat = 'ok' AND historique.idJeu_Jeu = "00201d1" AND historique.date  = (SELECT Max(historique.Date) AS lastDate
FROM historique WHERE historique.idJeu_Jeu="00201d1";



j'ai aussi remarqué que je n'avais pas besoin de lier la table historique à la table jeu xD

Citation:
La colonne idJeu de la table historique change de nom au cours de la requête(idJeu, idJeu_jeu,...).
non ^^ idJeu est l'identifiant de la table jeu...
idJeu_Jeu est la clé étrangère de la table historique qui référence jeu.idjeu...

oui je ne fais qu'exploiter des tables existantes...

pour le SGBD je suis sous Access 2002 -.-

Encore merci et je repasserai si j'ai d'autres questions
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 12h17   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par 0sef40 Voir le message
non ^^
Si !

Citation:
Envoyé par 0sef40 Voir le message
idJeu est l'identifiant de la table jeu...
idJeu_Jeu est la clé étrangère de la table historique qui référence jeu.idjeu...
Dans certaines requêtes, le nom de colonne n'est pas le bon alors :
Citation:
SELECT idJeu, MAX(date) AS MaxDte FROM Historique WHERE ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 13h47   #14
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
Citation:
Envoyé par aieeeuuuuu Voir le message
Si !
Dans certaines requêtes, le nom de colonne n'est pas le bon alors :

SELECT idJeu, MAX(date) AS MaxDte FROM Historique WHERE ...
C'est toi qui m'as écrit cette requête de mémoire :p

Bref enfaite je viens de m'apercevoir que j'allais devoir faire cette requête tout de même^^

pour être plus claire :

dans ma table : Historique

j'ai les colonnes :
- idHistorique
- idRampe_Rampe
- idJeu_Jeu
- Statut
- TSN
- TSO
- Resultat
- Date


et dans mon historique j'ai 1 rampe "rampe1" en statut "WIP" en 2012
une rampe "rampe2" en statut "WIP" en 2012 ET en 2014

je voudrais lister "idJeu_Jeu, idRampe_Rampe, Resultat, Statut, et Date"
pour chaque rampe qui est en statut "WIP" avec un resultat "ok" mais à la date la plus récente de la rampe (en gros avoir les infos de la rampe2 de 2014 et les info de la rampe1 de 2012 mais pas les infos de la rampe2 de 2012^^)


C'est claire? (parce que je m'embrouille à force)



Code :
1
2
3
SELECT idJeu_Jeu, idRampe_Rampe, Resutat, Statut,  Date 
FROM historique
WHERE  resultat = "ok" AND statut  = "WIP"
jusque là ca va^^ par contre j'arrive toujours pas à avoir la dernière date de chaque rampe...
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h05   #15
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Attention, vous avez une colonne nommée "date", qui est aussi un mot reservé au langage SQL, vous pouvez avoir des soucis.

Avez regardé avec le genre de requete que je vous avais fourni le 16/05 ?

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h56   #16
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par 0sef40 Voir le message
C'est toi qui m'as écrit cette requête de mémoire :p
tout à fait. Mais n'ayant pas la structure des tables, je l'avais écrite tel quel, en supposant que tu allais prendre la peine de ne pas faire simplement un copier/coller, mais au moins vérifier que les noms des tables et des colonnes étaient corrects...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/05/2011, 08h38   #17
 
Homme
Étudiant
Inscription : avril 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Landes (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 21
Points : -1
Points : -1
@aieeeuuuuu
J'ai posté le copier coller avec l'erreur pour que tu puisses éventuellement corriger ta requête si tu en avais envie...

j'ai essayé plusieurs modifications sans grand résultat du fait que je ne comprenais pas tout... (j. , h. j.jeu... j'ai fini par tout confondre^^).

Bref ne crois pas que je vienne demander une solution "toute faite et parfaite" je cherche je cherche^^


@ Yanika_bzh

Je ne peux pas exécuter la requête si "historique.date ne figure pas dans le group by en plus du having..."

Cette requête me donne les résultats récent et anciens...
0sef40 est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h08.


 
 
 
 
Partenaires

Hébergement Web