Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pb pour trier des données

    11 mai 2022 à 9:49:40

    Bonjour,

    Suite à un projet en première année de supérieur je me retrouve face à une difficulté que je n'arrive pas à résoudre. Pour résumer rapidement le contexte : 'Connaitre le nombre de voyage (Tip_ID) dont les moyens de transports sont l'avion ('Av') et la voiture ('Voit')'.

    Ma base de donnée après avoir fait une jointure me donne cette table :

     

    Les quelques lignes qui font cette requête : 

    SELECT 
        Trip_ID, 
        Transport_Type
    FROM trip
    INNER JOIN transport ON trip.Transport_ID = transport.Transport_ID
    WHERE Transport_Type = 'Av' OR Transport_Type = 'Voit';

    A la suite j'obtiens donc la photo ci dessus, j'avais l'idée d'utiliser un COUNT() et de mettre un WHERE avec les mêmes conditions...

    WHERE Transport_Type = 'Av' OR Transport_Type = 'Voit'

    On a donc en exemple un voyage (104) qui utilise 2x l'avion et 1x la voiture.

    J'ai eu l'idée de faire une requête qui me permettrait d'avoir en attribut le Trip_ID et ensuite mettre les différents types de transport en attributs (pas concluant pour le moment).

    (Merci d'avance pour vos réponses).

    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2022 à 10:28:01

      Bonjour,

      AloneCSGO a écrit:

      Connaitre le nombre de voyage (Tip_ID) dont les moyens de transports sont l'avion ('Av') et la voiture ('Voit')

      AloneCSGO a écrit:

      j'avais l'idée d'utiliser un COUNT() et de mettre un WHERE avec les mêmes conditions

      C'est bien ça ! Où as-tu bloqué ?

      SELECT
      	Transport_Type,
      	COUNT(*) AS nb_voyages
      FROM trip
      WHERE Transport_Type IN ( 'Av', 'Voit' )
      GROUP BY Transport_Type

      Je n'ai pas mis la jointure sur la table transport qui me semblait inutile, et un opérateur IN qui fait moins écrire que plusieurs OR.

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        11 mai 2022 à 10:49:18

        Merci de ta réponse.

        Oui je vois ton résonnement, la question peut se comprendre de 2 façons, la première que tu as expliqué, et la seconde consiste en (toujours en reprenant le screen plus haut) :

        Ressortir le nombre de voyage dont ce voyage utilise la voiture ET l'avion, donc ressortit uniquement 1 (le Trip_ID = 104).

        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2022 à 13:22:04

          AloneCSGO a écrit:

          Ressortir le nombre de voyage dont ce voyage utilise la voiture ET l'avion

          C'est vrai que je n'avais pas entendu l'énoncé dans ce sens ...

          Cela s'appelle une intersection (INTERSECT), et selon le SGBD utilisé la requête sera différente. Quel SGBD utilises-tu ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            11 mai 2022 à 13:53:32

            Ok j'ai réussi par mes moyens, voici la requête :

            SELECT k.Trip_ID
            FROM (SELECT Trip_ID
            FROM trip
            INNER JOIN transport ON trip.Transport_ID = transport.Transport_ID
            WHERE Transport_Type IN ('Av')) AS k
            INNER JOIN (SELECT Trip_ID
            FROM trip
            INNER JOIN transport ON trip.Transport_ID = transport.Transport_ID
            WHERE Transport_Type IN ('Voit')) AS j
            ON j.Trip_ID = k.Trip_ID
            GROUP BY k.Trip_ID;

            (Attention les jointure sont necessaire pour ma part car il me manque une info dans ma première table).

            Merci en tout cas de ton aide Benzouye.

            • Partager sur Facebook
            • Partager sur Twitter
              11 mai 2022 à 15:16:56

              C'est un peu lourdingue ...

              Syntaxe pour SQL Server et Oracle :

              SELECT DISTINCT Trip_ID
              FROM trip
              WHERE Transport_Type = 'Av'
              
              INTERSECT
              
              SELECT DISTINCT Trip_ID
              FROM trip
              WHERE Transport_Type = 'Voit'

              Syntaxe pour MySQL :

              SELECT DISTINCT Trip_ID AS nb_trips
              FROM trip
              WHERE 
              	Transport_Type = 'Av'
              	AND Trip_ID IN (
              		SELECT DISTINCT Trip_ID
              		FROM trip
              		WHERE
              			Transport_Type = 'Voit'
              	)

              AloneCSGO a écrit:

              Attention les jointure sont necessaire pour ma part car il me manque une info dans ma première table

              Je ne vois pas pourquoi ... Tu n'utilises aucune colonne de la table transport ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                11 mai 2022 à 18:29:26

                Benzouye a écrit:

                Je ne vois pas pourquoi ... Tu n'utilises aucune colonne de la table transport ...


                En effet ce n'est pas vraiment visible mais je récupère l'information du type de transport (Transport_Type).

                Et merci pour la syntaxe MySQL, elle m'a permis de résoudre d'autres requêtes.

                -
                Edité par AloneCSGO 11 mai 2022 à 18:32:05

                • Partager sur Facebook
                • Partager sur Twitter

                Pb pour trier des données

                × 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