Problème de jointure ?

Problème de jointure ? - SQL/NoSQL - Programmation

Marsh Posté le 04-09-2008 à 11:24:00    

Bonjour à tous,
 
j'ai un problème de requete SQL depuis hier.
J'ai 3 tables: semaine, personne et reservation.
 
semaine                     reservation                       personne
----------                ----------------               ----------------
id_semaine                 id_reservation                   id_personne
date_debut                id_semaine                        nom
date_fin                     id_personne
                                enchere
 
En gros, une personne peut réserver (une chambre par exemple) pour une semaine ou plusieurs. Mais pour l'obtenir, elle doit avoir la plus grande enchère, sachant qu'il y peut y en avoir plusieurs sur la même semaine évidemment (ou aucune même).
J'aimerais récupérer les semaines où il y a eu une (des) réservations avec le nom de la personne et son enchère, en l'occurence la max en cours.
 
Pour l'instant j'ai ca:

Code :
  1. select semaine.id_semaine, date_debut, date_fin, nom, max(enchere) as max_enchere
  2. from semaine, reservation, personne
  3. where semaine.id_semaine=reservation.id_semaine
  4. and reservation.id_personne=personne.id_personne
  5. group by semaine.id_semaine
  6. order by semaine.date_debut


 
J'arrive bien à récupérer les semaines qui ont eu des réservations avec leur enchère max. Par contre, l'enchère ne correspond pas à la bonne personne. J'ai loupé quelque chose  :??: parce que j'ai dans le where une condition qui devrait garantir la cohérence entre enchère et personne non?
 
Pouvez-vous m'aider pliz :(
Merci infiniment.


Message édité par welcominh le 04-09-2008 à 11:33:24

---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 04-09-2008 à 11:24:00   

Reply

Marsh Posté le 04-09-2008 à 11:41:13    

D'abord , apprendre à écrire explicitement les jointures ça évite bien des soucis.
Ensuite, quand tu utilises un aggregat, il vaut mieux grouper sur tous les champs selectionnés pour s'éviter des surprises ( la plupart des sgbd t'y forcent de toute façon).
Morale , t'as requête ne fais pas du tout faire ce que tu veux ( enfin ce que j'en comprends).

 

J'écrirai un truc comme ça:

Code :
  1. SELECT
  2.  s.id_semaine,
  3.  date_debut,
  4.  date_fin,
  5.  nom
  6. FROM
  7. semaine s
  8. INNER JOIN reversation r ON r.id_semaine = s.id_semaine
  9. INNER JOIN personne p ON p.id_personne = r.id_personne
  10. INNER JOIN (
  11.    SELECT
  12.      id_semaine,
  13.      max(id_enchere) AS mEnchere
  14.    FROM
  15.      reservation
  16.    GROUP BY id_semaine
  17.  ) m ON m.id_semaine = s.id_semaine AND r.enchere = m.mEnchere
 


Message édité par anapajari le 04-09-2008 à 11:42:18

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 04-09-2008 à 12:00:35    

je n'ai pas l'habitude d'utiliser les INNER JOIN. J'utilise seulement par exemple les LEFT JOIN car les jointures pas conditions "normales" ne peuvent pas le faire (si j'ai bien compris elles font ce que font les INNER JOIN).
 
En tout cas, ca marche bien ta requête. (je l'ai légèrement réadapté à mon cas)
Merci beaucoup !


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed