[SQL] GROUP BY ordonné par une autre colonne

Fermé
choy - 30 juil. 2008 à 15:21
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 - 30 juil. 2008 à 15:52
Bonjour à tous ! Alors voilà je bataille depuis un bon moment sur un problème de listing. Avant de rentrer dans la syntaxe sql je vais tenter d'expliquer ce que je doit faire.
Alors voilà, j'ai une liste d'hôtels pour lesquels j'ai une liste de prix associés à une période de temps. Sur le même shéma j'ai une liste de tarifs pour les vols aérien eux aussi liés à une date (entre autres). Avec ça, je doit créer une liste de "séjours" (hôtel+vol). Jusqu'ici pas de problème je liste les tarifs de chambres et je chope le vol le moins cher correspondant aux dates afin d'afficher un prix "à partir de" que j'utilise pour ranger mes séjours à l'aide d'order by. Mais pour pas que ça soit trop le bordel j'aimerai que seul le prix (chambre+vol) le moins cher par hôtel soit affiché. je fait donc un group by des id de mes hotels mais le problème et que du coup mon order se fait apres le group by... en gros je n'ai pas forcément le prix le moins cher.

Voilà ma requete :
SELECT hotels_id, tarifs_vols_prix, tarifs_chambres_prix, (
tarifs_chambres_prix + tarifs_vols_prix
) AS prix_total
FROM  `tarifs_chambres` 
LEFT JOIN  `types_chambres` ON tarifs_chambres_type = types_chambres_id
LEFT JOIN  `hotels` ON types_chambres_hotel = hotels_id
LEFT JOIN  `tarifs_vols` ON ( (
tarifs_vols_debut <= tarifs_chambres_debut
AND tarifs_vols_fin >= tarifs_chambres_debut
)
OR (
tarifs_vols_fin >= tarifs_chambres_fin
AND tarifs_vols_debut <= tarifs_chambres_fin
)
OR (
tarifs_vols_debut >= tarifs_chambres_debut
AND tarifs_vols_fin <= tarifs_chambres_fin
) ) 
ORDER BY prix_total ASC 


ce qui me donne :
hotels_id	tarifs_vols_prix	tarifs_chambres_prix	prix_total
1                      8.00                      8.00                    16.00
1                    10.00                      8.00                    18.00
1                      8.00                    13.00                    21.00
1                     15.00                     8.00                    23.00
1                    10.00                    13.00                    23.00
1                    15.00                    13.00                    28.00
2                      8.00                    36.00                    44.00
2                    10.00                    36.00                    46.00
2                    15.00                    36.00                    51.00

(J'ai fait de mon mieux pour que ça soit lisible :))
Donc en gras les deux lignes que j'aimerai faire ressortir malheureusement quand j'ajoute mon group by hotels_id ça ne sont pas celle là qui ressortent... quelqu'un a une solution ? une piste ?
un grand merci à tout ceux qui tenteront de m'aider :)
A voir également:

3 réponses

Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 383
30 juil. 2008 à 15:42
Bonjour choy,

As-tu déjà essayé d'ajouter la commande DISTINCT, comme ci-dessous (j'ai pas testé)
SELECT distinct hotels_id, tarifs_vols_prix, tarifs_chambres_prix, (
tarifs_chambres_prix + tarifs_vols_prix
) AS prix_total
FROM  `tarifs_chambres` 
LEFT JOIN  `types_chambres` ON tarifs_chambres_type = types_chambres_id
LEFT JOIN  `hotels` ON types_chambres_hotel = hotels_id
LEFT JOIN  `tarifs_vols` ON ( (
tarifs_vols_debut <= tarifs_chambres_debut
AND tarifs_vols_fin >= tarifs_chambres_debut
)
OR (
tarifs_vols_fin >= tarifs_chambres_fin
AND tarifs_vols_debut <= tarifs_chambres_fin
)
OR (
tarifs_vols_debut >= tarifs_chambres_debut
AND tarifs_vols_fin <= tarifs_chambres_fin
) ) 
ORDER BY prix_total ASC


A plus
0
Oui mais ça ne change rien, j'ai bien mon des hotels uniques mais pas forcément au meilleur prix.
Mais je viens de réussir ma manip (pour ceux qui penserai que j'ai posté directement je précise que je cherche depuis hier.). Donc en fait il fallait ajouter un MIN sur mon total couplé au group by hotels_id.
SELECT hotels_id, tarifs_vols_prix, tarifs_chambres_prix, MIN( tarifs_chambres_prix + tarifs_vols_prix ) AS prix_total
FROM  `tarifs_chambres` 
LEFT JOIN  `types_chambres` ON tarifs_chambres_type = types_chambres_id
LEFT JOIN  `hotels` ON types_chambres_hotel = hotels_id
LEFT JOIN  `tarifs_vols` ON ( (
tarifs_vols_debut <= tarifs_chambres_debut
AND tarifs_vols_fin >= tarifs_chambres_debut
)
OR (
tarifs_vols_fin >= tarifs_chambres_fin
AND tarifs_vols_debut <= tarifs_chambres_fin
)
OR (
tarifs_vols_debut >= tarifs_chambres_debut
AND tarifs_vols_fin <= tarifs_chambres_fin
) ) 
GROUP BY hotels_id
ORDER BY prix_total ASC

Merci à toi christounet pour ta réponse !
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 383
30 juil. 2008 à 15:52
Bonjour choy,

De rien et content que ton problème soit résolu.
A plus
0