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 21/11/2010, 19h29   #1
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
Par défaut Simple Question Logique

Bonjour,
j'ignore si la requête que je souhaite réaliser est possible, pouvez vous m'aider ?

soit 2 tables :
la table_t1 constituée de 2 champs id_t1, et pref_t1
la table_t2 constituée de 3 champs id_t2, pref_t2, et data_t2
Citation:
table_t1
id_t1 / pref_t1
01 / null
02 / null
03 / e12a5
04 / t1c9a
05 / null
06 / u8z45

table_t2
id_t2 / pref_t2 / data_t2
01 / e12a5 / 10
02 / e12a5 / 15
03 / e12a5 / 18
04 / t1c9a / 25
05 / t1c9a / 19
06 / t1c9a / 12
07 / u8z45 / 95
08 / u8z45 / 33
09 / u8z45 / 10

et voila le resultat que j'aimerais obtenir :
id_t1 / pref_t1 / data_t2
01 / null
02 / null
03 / e12a5 / 10
04 / t1c9a / 12
05 / null
06 / u8z45 / 10
c'est à dire tous les enregistrements de ma table_t1, mais s'il existe une correspondance entre table_t1 et table_t2 sur le champ "pref" alors je recupère seulement l'enregistrement de table_t2 qui contient la plus petite valeur dans le champ data_t2

j'espère avoir été assez clair
merci de vos réponses
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 00h34   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 470
Points : 10 470
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Oui c'est possible. Quel est votre SGBD et qu'avez-vous essayé ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 07h51   #3
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
votre reponse sous entend que la requete SQL va être differente selon le SGBD ?
j'utilise actuellement MySql

En ce qui concerne qu'est ce que j'ai déjà essayé, je ne sais pas si votre question porte sur le système SGBD ou sur le type de requête?

pour ce qui est de la seconde option j'ai toujours eu besoin de requêtes simples de jointures basiques alors là je n'ai rien essayé parce que je suis dépassé ;o(

Cordialement
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 10h01   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 943
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 943
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Comme tu veux toutes les lignes de t1, même quand il n'y a pas de correspondance dans t2, tu as besoin d'une jointure externe.

Ce n'est pas très difficile ; propose nous une requête et nous la corrigerons si besoin.
__________________
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 22/11/2010, 11h56   #5
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
Bjr CinePhil

voici donc ma requete :

Code :
1
2
3
4
5
6
7
8
9
  SELECT t1.id_t1,t2.pref_t2,t2.data_t2
    FROM table_t1 t1				
         LEFT OUTER JOIN table_t2 t2 
           ON t1.pref_t1 = t2.pref_t2
         LEFT OUTER JOIN table_t3 t3  -- parce qu'il y a aussi une table t3 
           ON t1.id_t1 = t3.id_t3	 -- il y a toujours pour toute valeur de t1.id_t1 une valeur t3.id_t3	
   WHERE t1.id_t1 > '01' -- juste pour qu'il y ait une condition
ORDER BY t1.id_t1 DESC 		
   LIMIT 0,30;
Merci de vous intéresser à mon triste sort mais pourquoi tenez vous absolument à voir ma requete puisque je ne maitrise plus du tout à ce niveau là ?
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 12h13   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 943
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 943
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
OK pour les jointures.
Citation:
il y a toujours pour toute valeur de t1.id_t1 une valeur t3.id_t3
Donc pour cette jointure, tu aurais pu mettre une jointure interne INNER JOIN.

La partie du besoin qui n'est pas couverte par ta requête est celle-ci :
Citation:
seulement l'enregistrement de table_t2 qui contient la plus petite valeur dans le champ data_t2
Il faut donc chercher la valeur minimum (MIN) et faire un groupage par id_t1, pref_t1 :
Code :
1
2
3
4
5
6
7
8
SELECT t1.id_t1, t1.pref_t1,
    MIN(t2.data_t2) AS min_data_t2
FROM table_t1 t1                
LEFT OUTER JOIN table_t2 t2 ON t1.pref_t1 = t2.pref_t2
INNER JOIN table_t3 t3 ON t1.id_t1 = t3.id_t3
WHERE t1.id_t1 > '01' -- juste pour qu'il y ait une condition
GROUP BY t1.id_t1, t1.pref_t1
ORDER BY t1.id_t1 DESC
Citation:
pourquoi tenez vous absolument à voir ma requete puisque je ne maitrise plus du tout à ce niveau là ?
Reconnais que tu apprends plus de choses en te forçant à chercher un peu que si on t'avais donné directement la solution !
__________________
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 10
Vieux 22/11/2010, 12h33   #7
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
Par défaut reponse en 3 points

1) Très sincèrement merci beaucoup
2) à partir de ta solution je teste dans tous les sens et je cherche à comprendre (et oui j'apprends bcq par l'exemple)
3) tu dis :
Citation:
en te forçant à chercher un peu
... ! 3 jours que je suis dessus pfffff ! j'ai 50 ans et plus trop de temps devant moi

Cordialement
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h41   #8
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
Par défaut POST SCRIPTUM

re ... délolé mais ...
c'est celle là que je ne comprends pas
Code :
GROUP BY t1.id_t1, t1.pref_t1
pourquoi juste ne suffisait pas ?
s'il vous reste 3 minutes...
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 17h05   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 943
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 943
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Parce que la norme demande que toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement figurent dans le GROUP BY.
MySQL est trop permissif avec une subtilité de la norme qui dit qu'on peut ne pas mettre toutes ces colonnes dans le GROUP BY si celles qui n'y sont pas dépendent directement de celle qui y est.

Par exemple, si j'ai une table de personnes (prs_id, prs_nom, prs_prenom...)
Je pourrais faire en MySQL :
Code :
1
2
3
4
SELECT prs_id, prs_nom, prs_prenom, COUNT(*)
FROM personne
INNER JOIN une_autre_table ON condition_de_jointure
GROUP BY prs_id
Les autres SGBDR ne l'autorisent pas alors que ce serait strictement conforme et donnerait un résultat juste.

Mais si je fais ceci :
Code :
1
2
3
4
SELECT p.prs_id, p.prs_nom, p.prs_prenom, prj.nom_projet, COUNT(*)
FROM personne AS p
INNER JOIN projet AS prj ON prj_id_responsable = p.prs_id
GROUP BY prs_id
MySQL a tort de l'autoriser car la valeur de nom_projet sera aléatoire. C'est pour ça que les autres SGBD l'interdisent tout le temps.
__________________
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 10
Vieux 22/11/2010, 17h57   #10
Futur Membre du Club
 
Homme
Développeur Web
Inscription : décembre 2003
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2003
Messages : 41
Points : 18
Points : 18
Merci.
ots2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h46.


 
 
 
 
Partenaires

Hébergement Web