Les Allergies
Alimentaires
Posez votre question Signaler

[SQL] GROUP BY ordonné par une autre colonne

choy - Dernière réponse le 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 :)
Lire la suite 

[SQL] GROUP BY ordonné par une autre colonne »

3 réponses
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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 !
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour choy,

De rien et content que ton problème soit résolu.
A plus
Ajouter un commentaire
Ce document intitulé « [SQL] GROUP BY ordonné par une autre colonne » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?