Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL sous Symfony

Symfony 4 et Doctrine

Sujet résolu
    2 octobre 2019 à 14:48:15

    Bonjour,

    Je me permet de vous contacter car je sèche sur ma requête.

    Pour vous expliquer ce que je souhaite je vais vous donner un exemple en espérant que celui-ci soit limpide.

    Imaginez que vous souhaitez louer un velo du 05/10 au matin  au 06/10 aprem. Quand vous voulez faire la location, pour pouvoir vous proposer différents lieux ou il y a des velos disponible, le systeme a besoin de connaitre le nombre de velos dispo par lieu. Il faut qu'il enleve par exemple le velo qui n'est loué que le 05/10 aprem et celui qui est loué du 06/10 aprem au 07/10 matin. 

    Lien du jeu de données : ICI

    Voici le résultat de la requête quand toutes les balises sont dispos :

    <markers>
    <marker idLoueur="17" nom="BANDOL - CENTRAL" cp="83150" ville="BANDOL" lat="43.13651" lng="5.75981" nbDial="5"></marker>
    <marker idLoueur="18" nom="BANDOL - GRAND VALLAT" cp="83150" ville="BANDOL" lat="43.13933" lng="5.76825" nbDial="7"></marker>
    <marker idLoueur="19" nom="BANDOL - PLAGE DU CASINO" cp="83150" ville="BANDOL" lat="43.13758" lng="5.7617" nbDial="3"></marker>
    <marker idLoueur="20" nom="BANDOL - RENÉCROS" cp="83150" ville="BANDOL" lat="43.13481" lng="5.75079" nbDial="5"></marker>
    <marker idLoueur="67" nom="LA LONDE - PLAGE DE L'ARGENTIÈRE" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.12062" lng="6.25907" nbDial="4"></marker>
    <marker idLoueur="68" nom="LA LONDE - PLAGE MIRAMAR" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11538" lng="6.24251" nbDial="4"></marker>
    <marker idLoueur="69" nom="LA LONDE - TAMARIS" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11738" lng="6.24979" nbDial="6"></marker>
    </markers>

    Voici l'affichage pour une location du 05/10 au 05/10. Il y a 2 balises de louées chez le loueur id 67 :

    <markers>
    <marker idLoueur="17" nom="BANDOL - CENTRAL" cp="83150" ville="BANDOL" lat="43.13651" lng="5.75981" nbDial="5"></marker>
    <marker idLoueur="18" nom="BANDOL - GRAND VALLAT" cp="83150" ville="BANDOL" lat="43.13933" lng="5.76825" nbDial="7"></marker>
    <marker idLoueur="19" nom="BANDOL - PLAGE DU CASINO" cp="83150" ville="BANDOL" lat="43.13758" lng="5.7617" nbDial="3"></marker>
    <marker idLoueur="20" nom="BANDOL - RENÉCROS" cp="83150" ville="BANDOL" lat="43.13481" lng="5.75079" nbDial="5"></marker>
    <marker idLoueur="67" nom="LA LONDE - PLAGE DE L'ARGENTIÈRE" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.12062" lng="6.25907" nbDial="2"></marker>
    <marker idLoueur="68" nom="LA LONDE - PLAGE MIRAMAR" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11538" lng="6.24251" nbDial="4"></marker>
    <marker idLoueur="69" nom="LA LONDE - TAMARIS" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11738" lng="6.24979" nbDial="6"></marker></markers>

    Tout es ok vu qu'il en avait 4 et qu'il est passé à 2

    Par contre lorsque je fais une location du 22 au 25/09, avec 2 balises louées le 22/09 et 2 balises louées le 25/09 pour le loueur id 18 :

    <markers>
    <marker idLoueur="17" nom="BANDOL - CENTRAL" cp="83150" ville="BANDOL" lat="43.13651" lng="5.75981" nbDial="5"></marker>
    <marker idLoueur="18" nom="BANDOL - GRAND VALLAT" cp="83150" ville="BANDOL" lat="43.13933" lng="5.76825" nbDial="7"></marker>
    <marker idLoueur="19" nom="BANDOL - PLAGE DU CASINO" cp="83150" ville="BANDOL" lat="43.13758" lng="5.7617" nbDial="3"></marker>
    <marker idLoueur="20" nom="BANDOL - RENÉCROS" cp="83150" ville="BANDOL" lat="43.13481" lng="5.75079" nbDial="5"></marker>
    <marker idLoueur="67" nom="LA LONDE - PLAGE DE L'ARGENTIÈRE" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.12062" lng="6.25907" nbDial="4"></marker>
    <marker idLoueur="68" nom="LA LONDE - PLAGE MIRAMAR" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11538" lng="6.24251" nbDial="4"></marker>
    <marker idLoueur="69" nom="LA LONDE - TAMARIS" cp="83250" ville="LA LONDE-LES-MAURES" lat="43.11738" lng="6.24979" nbDial="6"></marker></markers>


    Rien ne va plus ! Le nombre de balises pour le loueur 18 est de 7.

    Voici la requête : 

    SELECT
            loueur.id,
            count(balise.id) AS nb_balises,
            group_concat(location.id ORDER BY location.id SEPARATOR ', ') AS locations,
            group_concat(balise.id ORDER BY balise.id SEPARATOR ', ') AS balisess
        FROM
                    loueur
            LEFT JOIN
                    balise
                ON
                        loueur.id = balise.loueur_id
            LEFT JOIN
                    location_balise
                ON
                        balise.id = location_balise.balise_id
            LEFT JOIN
                    location
                ON
                        location_balise.location_id = location.id
                    AND :dateDebutLoc BETWEEN location.date_debut_loc AND location.date_fin_loc
                    AND :dateFinLoc BETWEEN location.date_debut_loc AND location.date_fin_loc
        WHERE
                balise.fonctionnel = true
            AND location.date_debut_loc IS NULL
        GROUP BY
            loueur.id







    • Partager sur Facebook
    • Partager sur Twitter
      2 octobre 2019 à 15:45:26

      Bonjour,

      Une question peut-être bête, mais une location pouvant concerner plusieurs vélos (balises) (d'où la table de relation) comment assures-tu qu'une balise de deux loueurs différents ne soient pas prises sur la même location ?

      Si tu devais dire en français ce que tu cherches à obtenir ce serait : "la liste des balises fonctionnelles par loueur, disponibles pour une période données" ?

      C'est bien cela ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        2 octobre 2019 à 15:53:57

        Benzouye a écrit:

        Bonjour,

        Une question peut-être bête, mais une location pouvant concerner plusieurs vélos (balises) (d'où la table de relation) comment assures-tu qu'une balise de deux loueurs différents ne soient pas prises sur la même location ?

        Si tu devais dire en français ce que tu cherches à obtenir ce serait : "la liste des balises fonctionnelles par loueur, disponibles pour une période données" ?

        C'est bien cela ?


        Pour répondre à ta première question je pense que la réponse est : parce qu'une balise est attribuée à un seul loueur.

        Et pour répondre à ta demande question, oui c ca ! Mais c'est plus un count qu'une liste.

        • Partager sur Facebook
        • Partager sur Twitter
          2 octobre 2019 à 16:24:42

          ElodieMartin13 a écrit:

          une balise est attribuée à un seul loueur

          Oui, mais lorsque tu insères dans la table de relation location_balise, rien n'empêche d'enregistrer une balise d'un autre loueur, j'entends par là que MySQL ne t'empêchera pas de la faire, sauf à mettre un TRIGGER pour contrôler cela ...

          Sinon pour ta question, j'imbriquerai les conditions de dates avec un OR et non un AND :

          SELECT
          	L.id,
          	count(*) AS nb_balises,
          	group_concat(B.id ORDER BY B.id SEPARATOR ', ') AS balisess
          FROM
          	loueur L
          		INNER JOIN balise_dial B
          			ON L.id = B.loueur_id
          		LEFT JOIN location_balise_dial RB
          			ON B.id = RB.balise_dial_id
          		LEFT JOIN location R
          			ON RB.location_id = R.id
          			AND (
          				'2019-10-05' BETWEEN R.date_debut_loc AND R.date_fin_loc
          				OR '2019-10-06' BETWEEN R.date_debut_loc AND R.date_fin_loc
          			)
          WHERE
          	B.fonctionnel = true
          	AND R.id IS NULL
          GROUP BY L.id



          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            2 octobre 2019 à 16:52:10

            Merci pour ton réponse. Alors ca marche presque, en résultat j'ai 4 alors que je devrais avoir 3 ! Il m'en enlève 3 au lieu de 4.

            Pour ce qui est de l'attribution des balises  tu as raison mais je pense que cela ne doit pas être fait ici.

            Dans cette requête j'ai juste besoin d'avoir un count pour faire apparaitre la liste des loueurs qui ont assez de balises par rapport à la quantité demandée.

            Ensuite le client choisi un loueur. 

            Je pense que c'est à la soumission du formulaire qu'il faut lui dire que pour tel id, trouve moi les balises dispo et choisis-en.

            Par contre j'avoue que je ne sais pas ou le faire ni comment !

            • Partager sur Facebook
            • Partager sur Twitter
              2 octobre 2019 à 17:33:48

              ElodieMartin13 a écrit:

              en résultat j'ai 4 alors que je devrais avoir 3 ! Il m'en enlève 3 au lieu de 4

              Oui ... la balise 31 n'est pas fonctionnelle (fonctionnel = 0), mais est présente sur la location 2 ... mais elle n'est pas comptabilisée dans les 7 au départ ... donc tout va bien ...

              On peut je pense simplifier les conditions un poil et ainsi optimiser le temps de traitement :

              SELECT
              	L.id,
              	COUNT(*) AS nb_balises,
              	GROUP_CONCAT( B.id ) AS balises
              FROM
              	loueur L
              		INNER JOIN balise B
              			ON L.id = B.loueur_id
              		LEFT JOIN location_balise RB
              			ON B.id = RB.balise_id
              		LEFT JOIN location R
              			ON RB.location_id = R.id
              			AND R.date_debut_loc <= '2019-09-25'
              			AND R.date_fin_loc >= '2019-09-22'
              WHERE
              	B.fonctionnel = 1
              	AND R.id IS NULL
              GROUP BY L.id

              Par contre, comment une balise peut-elle être non fonctionnelle mais quand même réservée ?

              -
              Edité par Benzouye 2 octobre 2019 à 17:37:19

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                2 octobre 2019 à 19:35:42

                Ben c'est juste une faute d'inattention de ma part lorsque j'ai fait mes locations de tests !  :(
                • Partager sur Facebook
                • Partager sur Twitter

                Requete SQL sous Symfony

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown