LEFT JOIN QUI NE MARCHE PAS [Résolu/Fermé]

Signaler
Messages postés
33
Date d'inscription
lundi 22 mai 2017
Statut
Membre
Dernière intervention
12 mars 2019
-
Messages postés
33
Date d'inscription
lundi 22 mai 2017
Statut
Membre
Dernière intervention
12 mars 2019
-
Bonjour à tous,

voilà j'ai un soucis avec du SQL, je dois obtenir la quantité de véhicules disponibles entre le 25 mai et le 26 mai 2017. J'ai la requête suivante :

SELECT v.id_type_vehicule, tv.nom, tv.nom_en, tv.nom_de, COUNT( v.id ) AS qte, tv.photo_url, tv.tarif_journalier
FROM vehicule v

LEFT JOIN location_vehicule lv ON v.id = lv.id_vehicule -- boucle sur les véhicules (véhicules numéro 1, 2, 3 etc.)
LEFT JOIN location loc ON lv.id_location = loc.id -- boucle sur les locations (locations numéro 1, 2, 3 etc.)
LEFT JOIN type_vehicule tv ON v.id_type_vehicule = tv.id -- boucle sur les types de véhicules (Clio, Fiat, Peugeot etc.)

WHERE

("2017/05/25" NOT BETWEEN loc.debut AND loc.fin) AND ("2017/05/26" NOT BETWEEN loc.debut and loc.fin) OR loc.debut IS NULL

GROUP BY v.id_type_vehicule
ORDER BY tv.tarif_journalier

Mon soucis est que je n'ai qu'une Clio de disponible et elle est louée du 10 au 24 mai puis du 27 mai au 5 juin. Lorsque je fait tourner ma requête elle me dit que il y a deux Clios de disponibles or j'en ai qu'une... Le soucis est que je boucle sur les commandes et que il y a bien deux commandes qui respectent mes conditions dans mon WHERE... Est ce que vous avez une solution à me proposer afin de tenir compte du fait que je n'ai qu'un seul véhicule ??

Un grand merci d'avance pour vos réponses !

Mathieu

4 réponses

Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
voici tous ceux qui ne sont pas disponibles:
select v.id 
FROM vehicule v, location_vehicule lv, location loc
WHERE lv.id_location = loc.id AND v.id = lv.id_vehicule
AND (loc.fin>="2017/05/25" AND loc.debut<="2017/05/26")

et donc je suggère ceci:
SELECT v.id, v.id_type_vehicule, tv.nom, tv.nom_en, tv.nom_de, tv.photo_url, tv.tarif_journalier 
FROM vehicule v 
LEFT JOIN type_vehicule tv ON v.id_type_vehicule = tv.id 
WHERE 
v.id NOT IN (select v.id 
FROM vehicule v, location_vehicule lv, location loc
WHERE lv.id_location = loc.id AND v.id = lv.id_vehicule
AND (loc.fin>="2017/05/25" AND loc.debut<="2017/05/26"))

qu'en penses-tu?
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
33
Date d'inscription
lundi 22 mai 2017
Statut
Membre
Dernière intervention
12 mars 2019

merci c'est top ça marche nickel !! ;)
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
bonsoir mathieu,
je vois que tu as quatre tables: vehicule, location_vehicule, location et type_vehicule.
est-ce exact?
tu écris " elle me dit que il y a deux Clios de disponibles". peux-tu être plus précis? as-tu deux lignes avec le même Clio, ou bien une seule ligne avec qte=2?
tu écris "je boucle sur les commandes", qu'entends-tu précisément par cela?
as-tu des index uniques dans tes tables? lesquels?
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
au lieu de:
("2017/05/25" NOT BETWEEN loc.debut AND loc.fin) AND ("2017/05/26" NOT BETWEEN loc.debut and loc.fin)

je suggère:
(loc.fin<"2017/05/25" OR loc.debut>"2017/05/26")
Messages postés
33
Date d'inscription
lundi 22 mai 2017
Statut
Membre
Dernière intervention
12 mars 2019

merci je viens d'essayer et au fait ta condition est ok mais j'ai tout de même deux clios qui s'affichent car les deux commandes enregistrées vérifient les conditions... Si je rajoute une commande du 1 mai au 2 mai alors la requête va renvoyer 3... Est ce que tu vois mon soucis ? Merci ! :)
Messages postés
33
Date d'inscription
lundi 22 mai 2017
Statut
Membre
Dernière intervention
12 mars 2019

Bonjour yg_be,

merci pour ta réponse ! J'ai bien quatre tables avec dans chacune des id uniques. Ci-joint des screenshots.

Les véhicules sont numérotés de 1 à 13 et la Clio correspond au véhicule numéro 7 (véhicule de type 3).

Mon soucis est que je n'ai qu'une Clio et que ma requête me dit que j'en ai 2 car elle boucle sur les commandes et j'en ai que deux pour le moment mais si j'en avais 10 alors ma requête dirait que j'en ai 10 :(

Merci d'avance pour ton aide !

Mathieu