Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requetes SQL comparaison de tables

    23 octobre 2019 à 9:43:08

    Bonjour / Bonsoir !

    Pour mon programme je doit crée une requête SQL qui compare deux table avec LIKE et une variable, ensuite ma requête doit sélectionner les champs les plus récent donc j'ai utiliser un MAX(mon_champ) avec un ORDER BY DESC LIMIT 1 pour avoir les deux champ les plus récent des deux tables.

    Maintenant je dois comparer ces deux champs qui me reste et qui sont de deux tables différente et je ne vois pas du tout comment faire :/ 

    Ma requête SQL (Qui comporte aussi une erreur de syntaxe mais je ne vois pas du tout ou elle peut être :/ RE : j'ai trouver cette erreur il fallait simplement que je mette un AND entre prisedeservice.numbadge et findeservice.numbadge au niveau du WHERE ^^)

    SELECT prisedeservice.prisefin, findeservice.prisefin, MAX(prisedeservice.datetime, MAX(findeservice.datetime) FROM prisedeservice, findeservice WHERE prisedeservice.numbadge, findeservice.numbadge LIKE \'%' + str(uiddecimal) + '%\' ORDER BY prisedeservice.id DESC LIMIT 1
    Ma BDD prisedeservice
    Ma table "prisedeservice"
    Ma table fin de service 

    -
    Edité par JulienElmon1 23 octobre 2019 à 10:30:07

    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2019 à 10:44:16

      Bonjour,

      JulienElmon1 a écrit:

      Ma requête SQL (Qui comporte aussi une erreur de syntaxe mais je ne vois pas du tout ou elle peut être :/ RE : j'ai trouver cette erreur il fallait simplement que je mette un AND entre prisedeservice.numbadge et findeservice.numbadge au niveau du WHERE ^^

      Oui, mais tu as aussi un problème de GROUP BY ... un peu de lecture ...

      Après, je ne comprend absolument pas ton problème.

      Peux-tu nous donner un exemple de données des deux tables et ce que tu voudrais obtenir comme résultat ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        23 octobre 2019 à 11:06:24

        Voila les donnée de chaque table 

        Prise de service :

        Fin de service :

        Ma démarche est la suivante, avec un lecteur de badge je récupère le numéro, ensuite avec un LIKE je le compare dans les deux tables pour voir si il existe. 

        Ensuite je demande à ma requête de prendre les ligne les plus récente avec un MAX(datetime), j'ai donc deux résultat (1 de chaque table).

        Ma question : Est-ce que je peux demander à ma requêtes de sélectionner le résultat le plus récent ?

        PS : j'ai changer ma requêtes SQL 

        SELECT prisedeservice.prisefin, findeservice.prisefin, MAX(prisedeservice.datetime, MAX(findeservice.datetime) FROM prisedeservice, findeservice WHERE prisedeservice.numbadge AND findeservice.numbadge LIKE \'%' + str(uiddecimal) + '%\' ORDER BY prisedeservice.datetime DESC LIMIT 1
        



        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2019 à 11:16:34

          JulienElmon1 a écrit:

          PS : j'ai changer ma requêtes SQL 

          SELECT prisedeservice.prisefin, findeservice.prisefin, MAX(prisedeservice.datetime, MAX(findeservice.datetime) FROM prisedeservice, findeservice WHERE prisedeservice.numbadge AND findeservice.numbadge LIKE \'%' + str(uiddecimal) + '%\' ORDER BY prisedeservice.datetime DESC LIMIT 1

          Le problème de GROUP BY est toujours le même ... Tu utilises une fonction d'agrégation, ici MAX(), avec des colonnes de regroupement, ici prisefin, mais sans donner de GROUP BY ... MySQL ne t'insulte pas parce qu'il est tolérant (cf. le lien donné plus tôt), mais il n'empêche que ta requête retourne sûrement des résultats étranges ...

          Sinon concernant ton problème, je commencerais par changer de modèle de données et ne travailler qu'avec une seule table de pointage qui dispose d'une date de début et d'une date de fin ...

          Le modèle serait en deux tables :

          • badges ( id_badge [pk], numero [unique], nom, prenom, etc. )
          • pointage ( id_pointage [pk], id_badge [fk], dateheure_debut, dateheure_fin )

          Lorsqu'une personne passe son badge, tu regardes dans la table si elle a un pointage sans date de fin.

          Si c'est le cas tu insères une ligne dans la table pointage avec l'id du badge et le datetime courant.

          Si il y a un pointage pour ce badge sans date de fin, tu mets à jour la date de fin du pointage avec le datetime courant.

          Bien plus simple non ?

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

            Les résultat que l'on me retourne ne sont pas étrange car c'est exactement ce que je demande dans ma requête ^^.

            Résultat : (0, 0, datetime.datetime(2019, 10, 22, 10, 48), datetime.datetime(2019, 10, 22, 11, 38))

            Après je conçois qu'il y a plus pratique et plus simple comme requête ^^, je vais tenter ta méthode et voir si ça colle ^^ 

            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2019 à 13:45:15

              JulienElmon1 a écrit:

              c'est exactement ce que je demande dans ma requête 

              Non ... pourquoi ? Lis le lien envoyé ... le hasard fait parfois bien les choses, surtout dans un petit jeu de données ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                6 novembre 2019 à 11:01:27

                Re : Alors après avoir essayer plusieurs solution dont la tienne, je me suis retournée sur des plage horaire avec les module time et datetime et cela marche à merveille ^^.

                Après je vais continuer sur cette idée que tu m'a donné car je n'était pas loin d'y arriver, j'avais juste un bug au niveaux de mes if qui vérifiait les champs de pointage, ma première condition était lue mais pas la deuxième et je n'ai pas encore trouver pourquoi :/  

                • Partager sur Facebook
                • Partager sur Twitter
                  6 novembre 2019 à 11:15:34

                  JulienElmon1 a écrit:

                  je me suis retournée sur des plage horaire avec les module time et datetime et cela marche à merveille ^^

                  Juste par curiosité, peux-tu partager ton code ? Et notamment l'adaptation de ta requête, celle où tu utilisait le GROUP BY à mauvais escient ...

                  JulienElmon1 a écrit:

                  ma première condition était lue mais pas la deuxième et je n'ai pas encore trouver pourquoi :/  

                  Tu parles là de code SQL ou de code Python ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    25 novembre 2019 à 9:34:50

                    Re : Désoler du retard j'était pas mal occuper :/

                    Alors pour mon GROUP BY utiliser à mauvais escient je ne retrouve plus mon code le contenant :/ maintenant que j'ai instauré des plage horaire j'ai surement du le supprimer :/, mais je vais tenter de le reconstruire et de te l'envoyer ^^

                    Je parlais de mon code python au niveaux des if qui devait vérifier sur la personne avait déjà badger ^^ 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Requetes SQL comparaison de tables

                    × 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