IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Insertion variables dans la base de données


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #21
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    En fait,
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$nomPourTable | $prenomPourTable | $datePourTable | $heureInPourTable1 | $heureOutPourTable1 | $heureInPourTable2 | $heureOutPourTable2 | $heureInPourTable3 | $heureOutPourTable3 | $heureInPourTable4 | $heureOutPourTable4 | $retard | $supp<br/>";
    m'affiche bien les bonnes informations.

    C'est l'insertion de ces informations dans la base de données qui ne se fait pas

  2. #22
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message

    A lire la partie concernant "try catch", afin d'afficher les erreurs/exceptions PDO.

  3. #23
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    J'ai entouré mon script du try catch mais pas d'erreur

  4. #24
    Invité
    Invité(e)
    Par défaut
    J'ai un scoop pour toi :

    • nous ne sommes ni devin, ni magicien.
    • on ne sait ni lire dans les esprits, ni dans les codes qu'on ne nous montre pas.

  5. #25
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Je joins la table horaires. et mon fichier afficheHeures.php
    Le code du calcul du retard et des heures supplémentaires n'est pas commenté mais il marche.
    Merci
    Fichiers attachés Fichiers attachés

  6. #26
    Invité
    Invité(e)
    Par défaut
    Il n'y a aucun try catch dans ton code...

    A mettre autour de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reusableStatement = $bdd->prepare($safeRequest);
    et de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $reusableStatement->execute([
    ...
    ]);

  7. #27
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    en faisant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     try {
    $reusableStatement = $bdd->prepare($safeRequest);
    ...
    $reusableStatement->execute([
    ...
    ]);
    } 
    catch(Exception $e){
       //s'il y a un probleme PHP ou SQL, que ce soit un warning ou une erreur fatale, tout s'affichera ici
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    j'obtiens
    PHP Parse error: syntax error, unexpected 'catch' (T_CATCH)
    Mais quand je déplace le try avant le $reusableStatement->execute ça ne bogue pas en me donnant pas d'erreur

  8. #28
    Invité
    Invité(e)
    Par défaut
    Il faut en mettre 2 !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
       $reusableStatement = $bdd->prepare($safeRequest);
    catch(Exception $e){
       print "Erreur prepare " . $e->getMessage() . "<br/>";
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try {
      $reusableStatement->execute([
      ...
      ]);
    catch(Exception $e){
       print "Erreur execute : " . $e->getMessage() . "<br/>";
    }
    Rappel : INDENTE ton CODE !

  9. #29
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Pas d'erreur

  10. #30
    Invité
    Invité(e)
    Par défaut
    OK.

    ter-repetita : INDENTE TON CODE !
    • plus facile à lire
    • moins de risque d'erreur


    En l'occurrence :

    1- ton code passe-t-il bien dans le "execute" ?
    Pour le savoir mets juste avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'on exécute la requete INSERT';
    2- es-tu sûr de la position de la DERNIERE ACCOLADE fermante (elle femre un "else") ?
    Ne devrait-elle pas être avant le "execute" ?

  11. #31
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    T'es un As.
    ça a marché. C'était la dernière accolade qui posait problème.
    Merci beaucoup les gars pour votre disponibilité et efficacité

  12. #32
    Invité
    Invité(e)
    Par défaut
    Les as méritent des , non ?


    Et la prochaine fois... INDENTE ton CODE !

    N.B. Quand je pense que j'ai eu DEUX à cause de ça dans mon 1er message et dans le 2ème... alors que c'était la BASE de la SOLUTION !...



    [EDIT] Et je me fais ENCORE MOINSSER !!!!

    SERIEUX ???
    Dernière modification par Invité ; 23/11/2018 à 15h36.

  13. #33
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Voilà merci encore

  14. #34
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Pour indenter : https://phpbeautifier.com/ — bien sûr, l’idéal étant d’adopter les bonnes habitudes pour ne plus avoir besoin du beautifier.

    Hichamus13, laisse-moi résumer la situation pour voir si j’ai bien compris le problème :
    1. Au départ, des employés pointent à la badgeuse avec leur badge qui contient un certain nombre d’informations dont le numéro de badge et un nom / prénom.
    2. La badgeuse ajoute des informations complémentaires dont la date / heure et envoie le tout vers un fichier excel.
    3. Un fichier par jour est créé ; il peut contenir des doublons si une personne a passé son badge plusieurs fois en moins de 15 secondes.
    4. Ce fichier est transformé en données dans la table tbl_excel, les détails de cette transformation sont inconnus (est-ce un script que tu as fait, ou quelque chose que tu ne peux pas contrôler ?). Dans le processus, la donnée du numéro de badge est perdue.


    L’élimination des doublons est le sujet de l’autre topic. Dans cet autre topic, tu expliques que tu as convenu, avec ton directeur de stage, d’une structure de table à 8 colonnes (sans compter le nom, prénom, etc.) contenant les multiples pointages d’une même personne.

    Entre temps, Badaze t’a aidé à régler le problème des doublons et tu as désormais une table horaires contenant les données de pointage.
    Le problème actuel est donc d’insérer les données venant de cette table horaires sous une forme « 8 colonnes ». J’ai bon ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #35
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Exactement c'est tout à fait cela.
    La transformation du fichier Excel vers la table tbl_excel est un script que j'ai fait.
    Le problème est dorénavant résolu. Merci pour votre implication

  16. #36
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Je serais malhonnête d’avoir critiqué un code que je croyais venir de hichamus13, et de ne pas critiquer le même code sachant qu’il vient de toi.

    Donc je persiste L’utilisation d’un fetch à l’intérieur de la boucle est, à mon avis, maladroit pour plusieurs raisons.

    D’abord, parce qu’on n’a pas besoin de ça pour transformer du vertical en horizontal. On peut le faire dans une requête SELECT avec les bonnes expressions, comme hichamus avait d’ailleurs commencé à le faire avec ses SUBSTRING dans l’autre topic (et pour rendre à César ce qui appartient à César, il s’était inspiré d’une requête que tu lui avais donnée). Il ne manquait qu’un CAST ou un CONVERT pour obtenir des DATETIME et pouvoir les manipuler confortablement.
    Mais je m’arrête là car c’est du matériau de réponse pour l’autre topic
    Il y a presque 4 ans j'avais répondu sur un forum technique italien à une demande pour un problème identique. Le passage d'une structure verticale à une horizontale n'est pas impossible mais compliqué et je ne pense pas que quelqu'un qui n'a que des bases en SQL puisse comprendre. Voir message #4.
    https://forum.html.it/forum/showthre...ght=disarmante


    Citation Envoyé par Watilin Voir le message
    Ensuite, parce que ça a une chance sur deux de « déborder », de faire un fetch de trop. Ce n’est pas très grave, mais ça manque d’élégance. Je n’arrive pas clairement à expliquer mon ressenti sans utiliser le mot « procédural » qui, au final, ne veut pas dire grand chose Mais l’idée générale c’est qu’on fait les choses un peu à la main et que ça pourrait être reformulé. Par exemple avec du SQL.
    Il n'y a aucune chance que ça "déborde". Le fetch utilise l'ensemble de données fourni par la requête. Si ça manque d'élégance c'est parce qu'il n'y a pas de fonctions natives qui permettraient de mettre une grande partie du code dans une fonction ou une méthode. Imagine que s'il n'y avait pas de méthode pour faire un fetch il faudrait sûrement l'écrire en utilisant la syntaxe SQL et là aussi ça ne serait pas élégant.


    Citation Envoyé par Watilin Voir le message
    Enfin, parce que c’est déstabilisant, ça va à l’encontre du principe de moindre surprise. La forme que jreaux62 a proposée est celle qu’on a l’habitude de voir. Un code surprenant, c’est un code plus difficile à maintenir, pour soi-même du futur ou pour les autres.
    Je ne pense pas que ce soit si difficile que ça à comprendre.


    Citation Envoyé par Watilin Voir le message
    J’ai une question, que je pose par pure curiosité : qu’est-ce qui t’a amené à penser qu’un GROUP BY n’était pas possible ?
    Parce qu'on ne regroupe pas. On aligne. Voir le premier point.


    Citation Envoyé par Watilin Voir le message
    Edit : je te lis bien quand tu dis que c’est une solution couramment utilisée, mais ça ne suffit pas à me convaincre que c’est une bonne solution
    Ils ont des fonctions natives qui rendent le code élégant.


    Citation Envoyé par Watilin Voir le message
    Edit 2 : en fait, je ne comprends même pas le besoin d’horizontaliser la structure. Quand on a une table avec un nombre arbitraire de colonnes qui contiennent des données de même nature, c’est signe qu’il y a un problème de conception. En déplaçant les données vers une autre table, et en ajoutant des contraintes de clés étrangères, on rend les choses à la fois plus flexibles et plus simples.
    Concrètement, pour moi, il devrait y avoir une table pour les employés et une table pour les pointages. Chaque pointage ferait référence à une entrée de la table des employés, et ne contiendrait qu’une seule donnée de date-heure. Ainsi, le nombre de pointages par employé peut être quelconque.
    Je suis tout à fait d'accord sur le principe. Ensuite il y a la réalité. Dans le cas de hichamus13 les données proviennent de badgeuses et je ne suis pas sûr que l'encodage d'une carte se fasse avec l'identifiant de l'employé. Les cartes sont faites "sur le champ" par des chefs d'équipes qui connaissent le nom et le prénom de la personne mais pas son n° de matricule. De plus dans beaucoup de petites structures il n'y a pas de "gros" service informatique. Certaines fois ils ont des prestataires et d'autres fois ils font appels aux service de leur éditeur de logiciel qui prennent une blinde. Donc pour eux une solution pas chère pas chiadée mais qui couvre 80% du besoin est préférable à une solution complète efficace et plus coûteuse.
    Il y a quelques années j'ai eu une PME comme client. Ils devaient m'envoyer un fichier de commandes (entête + lignes). Mais leur logiciel de gestion commerciale ne permettait que de faire un fichier entête et un fichier lignes. J'ai dû leur écrire un programme en Delphi pour qu'ils puissent concaténer les deux fichiers en un seul car cela m'aurait coûté beaucoup plus de modifier mon applicatif conçu pour fonctionner avec un seul fichier de commandes.

    Actuellement j'ai un client pour lequel il faut que je fasse l'inverse du questionnement actuel. Je dois passer d'une structure horizontale à une structure verticale. Heureusement ce client n'est actif qu'en novembre et début décembre et transmet toutes ses commandes en une seule fois. Et là aussi c'est pas piqué des vers sachant que j'ai un fichier Excel et .... un AS400 qui ne sait pas les lire ! Autres contraintes quand j'ai fait la première campagne j'étais déjà en retard quand j'ai appris que je devais m'en occuper + petit client = petit bénéfice donc pas de dév. Solution ? Transformation en .csv un petit script php et j'ai mon fichier vertical que l'AS400 sait traiter.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  17. #37
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par jreaux62 Voir le message

    @badaze
    Perso, dans un cas comme ça, je passerais par un array intermédiaire au lieu de vouloir tout faire en une passe.

    1- requête, en ordonnant sur les employés, puis les heures de pointage

    2- while(...row...) : On enregistre dans un array intermédiaire, indexé sur le nom/identifiant de l'employé .
    On obtient la "structure horizontale" dont vous parliez.

    3- sur cet array, pour chaque employé (en index de l'array !), on peut effectuer les tests et traitements des cas spéciaux (une heure de début, mais pas d'heure de fin...)
    Au final on obtient un array avec :
    • En index l'identifiant employé
    • En valeur(s) le résultat des opérations (nombres d'heures effectuées dans la journée,...)

    4- foreach(...array...) : Il ne reste plus qu'à parcourir l'array pour enregistrer les résultats en base de données.
    Je n'y avais pas pensé (habitude quand tu nous tiens). Je prends !
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #38
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    @badaze: En attendant j’étais parti sur une idée à base d’auto jointure externe, et je vois que c’est la solution que tu as utilisée sur le forum italien. Et comme ici on a besoin de huit colonnes, il faut donc… Huit auto jointures. Je suis pas sûr du tout de la performance du truc

    Mais pour la science, je vais livrer ici ce que j’ai produit.

    D’abord, je suis reparti de la table tbl_excel et j’ai créé une vue pour avoir des colonnes avec les bons types date et time. Évidemment c’est une solution temporaire, car en refaisant la structure de la table pour avoir les bons types dès le départ, on n’aurait pas besoin de cette vue.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    -- Ceci ne doit pas rester une vue, c’est une solution temporaire
    CREATE OR REPLACE VIEW vw_checkings AS
        SELECT
            id,
            description,
            DATE(checking_datetime) AS checking_date,
            TIME(checking_datetime) AS checking_time
        FROM (
            SELECT id, description, CAST(CONCAT(
                SUBSTR(`date`, 7, 4),
                '-',
                SUBSTR(`date`, 4, 2),
                '-',
                SUBSTR(`date`, 1, 2),
                ' ',
                SUBSTR(`date`, 12, 9)
            ) AS DATETIME) AS `checking_datetime`
            FROM tbl_excel
        ) AS subquery;

    La vue / future table ressemble à ceci :
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +----+------------------+---------------+---------------+
    | id | description      | checking_date | checking_time |
    +----+------------------+---------------+---------------+
    |  1 | Zitouni,M'Hamed  | 2018-09-14    | 19:37:43      |
    |  2 | KADIRI,Soulaima  | 2018-09-14    | 19:37:40      |
    |  3 | Bitouri,Ihssane  | 2018-09-14    | 19:37:39      |
    |  4 | KADIRI,Soulaima  | 2018-09-14    | 19:37:07      |
    ...

    Ensuite j’ai éliminé les doublons avec une auto-jointure. J’ai aussi créé une vue là-dessus, mais on pourrait faire le choix de carrément supprimer les doublons de la base.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- On pourrait aussi éliminer la vue suivante si on prenait le parti de
    -- supprimer les doublons purement et simplement avec une requête DELETE
    CREATE OR REPLACE VIEW vw_unique_checkings AS
        SELECT * FROM vw_checkings
        WHERE id NOT IN (
            SELECT B.id
            FROM checkings A
                JOIN checkings B
                    ON A.description = B.description
                    AND A.checking_date = B.checking_date
                    AND A.checking_time < B.checking_time
            WHERE
                ABS(TIME_TO_SEC(A.checking_time) - TIME_TO_SEC(B.checking_time)) < 15
        );

    Voilà ce que nous sort la sous-requête que j’ai utilisée dans le IN :
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +-----+--------------+---------------+---------------+-----+--------------+---------------+---------------+
    | id  | description  | checking_date | checking_time | id  | description  | checking_date | checking_time |
    +-----+--------------+---------------+---------------+-----+--------------+---------------+---------------+
    |  89 | MAMOUN,Tarik | 2018-09-14    | 14:14:19      |  96 | MAMOUN,Tarik | 2018-09-14    | 14:14:23      |
    | 108 | ADI,Salma    | 2018-09-14    | 12:36:55      | 103 | ADI,Salma    | 2018-09-14    | 12:37:01      |
    | 156 | Rita,Salma   | 2018-09-14    | 08:05:21      | 155 | Rita,Salma   | 2018-09-14    | 08:05:22      |
    | 113 | DERAT,Siham  | 2018-09-14    | 09:21:01      | 168 | DERAT,Siham  | 2018-09-14    | 09:21:03      |
    +-----+--------------+---------------+---------------+-----+--------------+---------------+---------------+
    La condition A.checking_time < B.checking_time permet de s’assurer que le doublon est toujours à droite. Du coup on prend B.id pour avoir l’id du doublon.
    Le ABS, j’imagine qu’il n’est pas nécessaire, mais c’est juste une précaution, et puis je trouve que ça ajoute du sens.
    Le TIME_TO_SEC je l’ai piqué à badaze dans l’autre topic (Si on compte sur la conversion implicite on a des résultats bizarres comme 12:37:01 - 12:36:55 = 46, je veux bien qu’on m’explique )

    Et enfin, la méga-jointure :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    SELECT * FROM (
        SELECT A.id, A.description, A.checking_date,
            A.checking_time AS time_A,
            B.checking_time AS time_B,
            C.checking_time AS time_C,
            D.checking_time AS time_D,
            E.checking_time AS time_E,
            F.checking_time AS time_F,
            G.checking_time AS time_G,
            H.checking_time AS time_H
        FROM vw_unique_checkings A
            LEFT JOIN vw_unique_checkings B
                ON A.description = B.description
                AND A.checking_date = B.checking_date
                AND A.checking_time < B.checking_time
            LEFT JOIN vw_unique_checkings C
                ON A.description = C.description
                AND A.checking_date = C.checking_date
                AND B.checking_time < C.checking_time
            LEFT JOIN vw_unique_checkings D
                ON A.description = D.description
                AND A.checking_date = D.checking_date
                AND C.checking_time < D.checking_time
            LEFT JOIN vw_unique_checkings E
                ON A.description = E.description
                AND A.checking_date = E.checking_date
                AND D.checking_time < E.checking_time
            LEFT JOIN vw_unique_checkings F
                ON A.description = F.description
                AND A.checking_date = F.checking_date
                AND E.checking_time < F.checking_time
            LEFT JOIN vw_unique_checkings G
                ON A.description = G.description
                AND A.checking_date = G.checking_date
                AND F.checking_time < G.checking_time
            LEFT JOIN vw_unique_checkings H
                ON A.description = H.description
                AND A.checking_date = H.checking_date
                AND G.checking_time < H.checking_time
    ) AS subquery
    GROUP BY description
    ORDER BY description, checking_date;

    Pour chaque champ description, le GROUP BY ne garde que la première ligne et le sens des comparaisons nous garantit que la première ligne est toujours celle qui contient tous les pointages. Voilà le résultat :

    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +-----+---------------------+---------------+----------+----------+----------+----------+--------+--------+--------+--------+
    | id  | description         | checking_date | time_A   | time_B   | time_C   | time_D   | time_E | time_F | time_G | time_H |
    +-----+---------------------+---------------+----------+----------+----------+----------+--------+--------+--------+--------+
    | 172 | Abidar,Hossam       | 2018-09-14    | 08:00:38 | 17:08:05 | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 165 | ADI,Salma           | 2018-09-14    | 08:02:18 | 12:36:55 | 17:02:01 | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 182 | AFI,Amal            | 2018-09-14    | 07:55:03 | 17:02:23 | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 124 | AHARRACH,Jamila     | 2018-09-14    | 08:20:06 | 17:04:05 | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 180 | AKABLI,Latifa       | 2018-09-14    | 07:56:15 | NULL     | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 197 | AL,Kaoutar          | 2018-09-14    | 07:43:50 | 17:02:14 | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    | 202 | ALAMI,Hind          | 2018-09-14    | 07:40:05 | NULL     | NULL     | NULL     | NULL   | NULL   | NULL   | NULL   |
    ...
    On peut éventuellement utiliser COALESCE pour remplacer les NULL par "00:00:00" ou tout autre valeur.

    Voilà, comme je l’ai dit, c’est pour la science parce que je n’ai pas du tout vérifié les performances de ce monstre, mais il n’y a pas un poil de PHP dans tout ça, et je ne sais pas pour vous, mais moi je trouve ça beau :’)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  19. #39
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @Watilin. Pour la performance, un accès mémoire sera toujours plus rapide qu'un accès disque.... même SSD .

    Pour ma part, j'avais commencé à pondre une requête qui ressemble à la tienne mais j'étais bloqué car si j'avais bien les enregistrements en ligne "kivonbien" j'avais aussi les autres ! Et puis l'illumination. Et si je comptais les 'heures' <> de null et que je ne prenais que les enregistrements en ayant le maximum pour une clé.

    J'étais parti sur 5 heures par ligne mais avec 8 c'est le même principe.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    SELECT nom, prenom, `date`, H1, H2, H3, H4, H5 FROM
    (
     SELECT h1.`nom` AS nom, h1.`prenom` AS prenom, h1.`date` AS `date`, 
     h1.`heure` AS H1, 
     h2.`heure` AS H2,
     h3.`heure` AS H3,
     h4.`heure` AS H4,
     h5.`heure` AS H5,
     1 +
     CASE WHEN h2.`heure` IS NULL THEN 0 ELSE 1 END +
     CASE WHEN h3.`heure` IS NULL THEN 0 ELSE 1 END +
     CASE WHEN h4.`heure` IS NULL THEN 0 ELSE 1 END +
     CASE WHEN h5.`heure` IS NULL THEN 0 ELSE 1 END AS C_NOT_NULL
     FROM `horaires` h1
     LEFT JOIN `horaires` h2 
       ON h2.`nom` = h1.`nom` AND h1.`prenom` = h2.`prenom` AND h1.`date` = h2.`date` AND h2.`heure` > h1.`heure`  
     LEFT JOIN `horaires` h3 
       ON h3.`nom` = h2.`nom` AND h2.`prenom` = h3.`prenom` AND h2.`date` = h3.`date` AND h3.`heure` > h2.`heure`
     LEFT JOIN `horaires` h4 
       ON h4.`nom` = h3.`nom` AND h3.`prenom` = h4.`prenom` AND h3.`date` = h4.`date` AND h4.`heure` > h3.`heure` 
     LEFT JOIN `horaires` h5 
       ON h5.`nom` = h4.`nom` AND h4.`prenom` = h5.`prenom` AND h4.`date` = h5.`date` AND h5.`heure` > h4.`heure`
    ) RESULTAT
    GROUP BY nom, prenom, `date`
    HAVING MAX(C_NOT_NULL)
    ORDER BY nom, prenom, `date`

    Nom : Capture20181142_001.JPG
Affichages : 158
Taille : 39,0 Ko

    C'est vrai que c'est plus "élégant" mais aussi plus compliqué à mettre en oeuvre. Si hichamus13 doit ajouter 2 colonnes il faudra qu'il modifie la requête et la table résultat. Avec la solution "procédurale" il n'a qu'a modifier la table résultat.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  20. #40
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci les gars pour vos suggestions. J'essayerai de les mettre en oeuvre.
    Bien à vous

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. insertion automatique dans une base de données
    Par sion76 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 28/07/2009, 16h46
  2. [MySQL] Enregistrer une variable dans la base de données
    Par naim2009 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/03/2009, 23h34
  3. [AJAX] Insertion erroné dans la base de données
    Par DeeVoiD dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/01/2009, 16h22
  4. Insertion Enorme dans une base de données
    Par jad_jad dans le forum Débuter
    Réponses: 3
    Dernier message: 06/06/2008, 19h02
  5. [HTML] Probleme d'insertion HTML dans une base de données MySQL
    Par tarzanjane dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/09/2006, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo