LEFT JOIN QUI NE MARCHE PAS

Résolu
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

  1. Contributeur
    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?
    1. Contributeur
      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")
      1. 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 ! :)
    2. Contributeur
      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 c'est top ça marche nickel !! ;)
    3. 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