LEFT JOIN QUI NE MARCHE PAS

Résolu/Fermé
matmat8888 Messages postés 33 Date d'inscription lundi 22 mai 2017 Statut Membre Dernière intervention 12 mars 2019 - 22 mai 2017 à 21:37
matmat8888 Messages postés 33 Date d'inscription lundi 22 mai 2017 Statut Membre Dernière intervention 12 mars 2019 - 23 mai 2017 à 00:20
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

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
22 mai 2017 à 22:35
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
matmat8888 Messages postés 33 Date d'inscription lundi 22 mai 2017 Statut Membre Dernière intervention 12 mars 2019
23 mai 2017 à 00:20
merci c'est top ça marche nickel !! ;)
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
22 mai 2017 à 22:01
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?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
22 mai 2017 à 22:11
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")
0
matmat8888 Messages postés 33 Date d'inscription lundi 22 mai 2017 Statut Membre Dernière intervention 12 mars 2019
22 mai 2017 à 23:11
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 ! :)
0
matmat8888 Messages postés 33 Date d'inscription lundi 22 mai 2017 Statut Membre Dernière intervention 12 mars 2019
22 mai 2017 à 23:00
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
0