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

Langage PHP Discussion :

Tableau à l'horizontal (Nom sans doublon); Semaine; TSI [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Bonjour à vous tous,

    Je suis partie d'une vieille discussion de 2006 intitulé "[html PHP] Affichage des résultats à l'horizontal"

    Je débute et je m'adresse à vous car je rencontre des difficultés pour concevoir un tableau que je crée à partir de données d'une base sql.
    Ci joint, une image du tableau que j'ai fait sous Excel (Sans titre-2.png).
    C'est un peu compliqué à expliquer mais voilà, j'ai dans ma base de donnée une liste de joueurs de foot et pour chacun d'eux un nouveau TSI (Note de performance) toutes les semaines.
    Je vous joint le fichier table_hattrick_2(1).sql pour que vous vous rendez compte de la difficulté.

    J’aimerais faire un tableau horizontal avec:
    Dans les colonnes, les notes obtenues à chaque semaine (Colonne1) et une ligne pour chaque joueur (Nom)

    J'arrive à faire un tableau mais le problème c'est qu'il liste le nom du joueur pour chaque note et à la vertical comme ceci:

    Colonne1 Nom TSI
    1 Laurent Barel 1330
    2 Laurent Barel 2510
    3 Laurent Barel 2110
    4 Laurent Barel 2500
    5 Laurent Barel 2980
    6 Laurent Barel 3430
    7 Laurent Barel 4140
    8 Laurent Barel 4780
    9 Laurent Barel 4930
    10 Laurent Barel 5060
    11 Laurent Barel 5520
    12 Laurent Barel 6010
    13 Laurent Barel 5820
    14 Laurent Barel 7420
    15 Laurent Barel 8170
    16 Laurent Barel 8790
    17 Laurent Barel 9410
    1 Ludovic Fourny 590
    2 Ludovic Fourny 720
    3 Ludovic Fourny 770
    4 Ludovic Fourny 810
    5 Ludovic Fourny 850
    .....

    J'aimerais obtenir ceci:

    Listé les noms (sans doublon) dans la ère colonne Nom/TSI
    Listé les semaines dans la 1ère ligne Nom/TSI
    et complété le tableau avec les TSI de chaque Nom pour les différentes semaine

    Nom/TSI 1 2 3 4 5 6 7 8 9 10 11
    Laurent Barel 1330 2510 2110 2500 2980 3430 4140 4780
    Ludovic Fourny 590 720 770 810 850 et ainsi de suite
    Nom
    Nom

    Je vous joins le fichier de ce que j'ai déjà réussi à faire(Ma première page.html).
    j'ai fait un graphique des TSI d'un joueur, lister les semaines et le TSI correspondant et un tableau listant les Joueurs.
    J'aimerais maintenant faire un tableau horizontal avec ces différentes données.
    Si ce type de tableaux est réalisable, pouvez-vous m'aider à le réaliser en me donnant la marche à suivre, des exemples de code?
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Le support de la version 5.2 de PHP s'est arrêté le 6 Janvier 2011. Donc avant toute chose, passe à la version 7.4. (Idem pour MySQL qui s'il a été installé en même temps doit en être à la version 5.1 qui n'est plus supportée depuis Décembre 2013. Dans ce cas passe à la version 8.0).

    Ensuite, le problème que tu cherches à résoudre pourrait se traiter coté PHP certes, mais ce n'est pas la bonne manière de faire. Tu peux en effet obtenir ce résultat directement avec la bonne requête SQL (avec MySQL à jour):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Nom, JSON_ARRAYAGG(TSI) as TSI_List
    FROM table_hattrick_2
    GROUP BY Nom;



    Cela dit, je te conseille de suivre des tutoriels sur la conception des bases de données (et en particulier sur les formes normales), car actuellement tu l'utilises comme un tableur. N'hésite pas, il y a de quoi faire sur ce site.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Tu as les bonnes données pour créer ton tableaux.
    Il faut juste que dans ta logique de construction de tableau tu fasse la chose suivante :

    Pour toutes mes données
    Si nouveau joueur ou premier jouer alors création d'une ligne
    Sinon création d'une colonne

    Ce qui en code se traduirais par quelque chose comme :

    Code : 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
     
    $table = '<table>';
    $lastPlayer = null;
     
    foreach($datas as $joueur) {
    	if($lastPlayer == null || $lastPlayer != $joueur['nom']) {
    		// Création d'une nouvelle ligne
    		if($lastPlayer != null) {
    			$table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
    		}
    		$table .= '<tr><td>'.$joueur['nom'].'</td>';
    	}
     
    	$table .= '<td>'.$joueur['score'].'</td>';
    	$lastPlayer = $joueur['nom'];
    }
     
    $table .= '</tr></table>';
     
    echo $table;
    Par contre dans l'idéal il faudrait avoir un identifiant par joueur plutot que de comparer leur nom car ca va générer des problèmes en cas d'homonymie.
    Evidemment tout ca ne marche que si tout le monde à le même nombre de données par semaine. Sinon il faudra normaliser le tableaux avant.

    --edit--

    Merci Cosmoknacki j'aurais appris un truc avec JSON_ARRAYAGG ajourd'hui !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    OUAHHHH !!!! Alors là, je suis impressionné par vos connaissances.
    J'ai lu attentivement votre réponse et effectivement, je n'étais pas du tout sur cette logique.
    Vous m'avez fait avancé d'un grand pas en un échange. un grand MERCI !!!
    J'ai repris votre code que je l'ai adapté à mes besoins.
    ça n'a pas marché du premier coup et là, un dernier coup de F5 et TADAAAAAA, un tableau comme je vous l'avez indiqué.
    Voici mon code adapté:

    Code : 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
    <?php
    $req = $bdd->query('SELECT Colonne1, Nom, TSI FROM `table_hattrick_2` WHERE TSI');
    $table = '<table_hattrick_2>';
    $lastPlayer = null;
     
    foreach($req as $joueur) {
        if($lastPlayer == null || $lastPlayer != $joueur['Nom']) {
            // Création d'une nouvelle ligne
            if($lastPlayer != null) {
                $table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
            }
            $table .= '<tr><td>'.$joueur['Nom'].'</td>';
        }
        $table .= '<td>'.$joueur['TSI'].'</td>';
        $lastPlayer = $joueur['Nom'];
    }
    $table .= '</tr></table>';
    echo $table;
    ?>
    J'ai une question, dois-je suivre la même logique pour faire les entêtes du tableau qui se composes ainsi:

    NON/TSI 1 2 3 4 5 6 7 8 9 ...........

    Je vous joins en pièce joint le résultat déjà obtenu (Test_5.inc.php.html)

    Sinon, pour répondre aux autres interrogations, je suis bien avec les bonnes versions, c'est juste une erreur de ma pars.
    Concernant les homonymies, dans le jeu Hattrick, il ne peut pas en avoir.
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Ah, une dernière chose, j'ai remarqué que les TSI pour les joueurs arrivés en cours de saison ne sont pas dans les bonnes colonnes.
    Exemple avec Gerald Schweiger qui a trois notes qui se trouve dans les premières colonnes au lieu d'être dans les colonnes 15; 16 et 17.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Bonjour,

    Je poste mes avancements sur la création du tableau.
    J'ai réussi à créer l'entête du tableau avec les numéros de semaine. (voir pièce jointe)
    et le code:
    Code : 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
     
    <!DOCTYPE html>  
    <table id="table1" class="table table-bordered">
    <br>
            <tr>
            <th><p class="text-error">Non/TSI</p></th>
    <?php
    $req = $bdd->query('SELECT DISTINCT Colonne1 FROM table_hattrick_2 where Colonne1');
    $table = '<table_hattrick_2>';
    $lastColonne1 = null;
     
    foreach($req as $Colonne1) {
        if($lastColonne1 == null || $lastColonne1 != $Colonne1['Colonne1']) {
            // Création d'une nouvelle cellule
            $table .= '<td>'.$Colonne1['Colonne1'].'</td>';
        }
    }
    //$table .= '</tr></table>';
    echo $table;
    ?>
    <?php
    $req = $bdd->query('SELECT Colonne1, Nom, TSI FROM `table_hattrick_2` WHERE TSI');
    $table = '<table_hattrick_2>';
    $lastPlayer = null;
     
    foreach($req as $joueur) {
        if($lastPlayer == null || $lastPlayer != $joueur['Nom']) {
            // Création d'une nouvelle ligne
            if($lastPlayer != null) {
                $table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
            }
            $table .= '<tr><td>'.$joueur['Nom'].'</td>';
        }
     
        $table .= '<td>'.$joueur['TSI'].'</td>';
        $lastPlayer = $joueur['Nom'];
    }
    $table .= '</tr></table>';
    echo $table;
    ?>
    Par contre, je ne trouve pas le moyen de gérer le décalage des TSI pour les joueurs arrivés en cours de saison.
    Ils sont trois => Gerald Schweiger; Juan David Carvajalino; Rodrigo Falcón et Roman Nawrot
    Leurs TSI devraient être en bout de ligne comme sur le tableau posté dans mon premier message.

    Avez-vous une solution pour gérer ce décalage?
    Merci encore pour votre aide.
    Fichiers attachés Fichiers attachés

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    As tu essayé la solution proposée par CosmoKnacki ? Elle te permettrait peut être de gérer plus facilement cette problématique de décalage.

    Sinon avec ta solution actuelle , il faut retraiter le tableaux extrait de ta base avant de construire le tableau html.

    Tu fais une première requete pour connaitre le nombre max de semaine,
    Puis pour chaque joueur du tableau tu vérifies si il à une donnée pour cette semaine et si ce n'est pas le cas tu lui ajoute 0 (par exemple).

    Y'a peut être moyen de le faire en SQL directement mais je sais pas faire.

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    La requête que j'ai proposée rencontre le même problème de décalage.

    Je voudrais pas être oiseau de mauvaise augure, ni entamer ton enthousiasme, mais en l'état actuel des choses, je pense qu'il est inutile de s'acharner tant que tu ne te seras pas pencher sérieusement sur la modélisation de bases de données relationnelles car là c'est la cata et pour plein de raisons. Même si tu arrives à résoudre ton problème actuel avec PHP, au prochain truc que tu essayeras de faire, la situation risque d'être tout aussi cauchemardesque (voir pire).

    Je fais des tentatives de mon coté pour donner une nouvelle forme à cette base, mais j'avoue que je galère notamment à cause des noms de colonnes qui ne veulent rien dire (`Colonne1`, `Colonne2`) ou qui ne m'évoquent rien (`TSI`, `En vente`, `Jours` ou `Semaines au club`, je ne suis pas footeux). Pourrais-tu les expliquer précisément? Comment décrirais-tu ta base de données, son objectif?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,

    Merci Grunk pour ton retour.
    J'ai testé la requête de CosmoKnacki qui m'a donnée un résultat étonnant. Je ne pensais pas qu'ont pouvais obtenir ce type de résultat avec une requête.
    Je n'ai pas réussi à exploiter cette requête dans mon code, je débute mais j'apprends de jour en jour.
    La solution que tu m’as proposée m'a permis de l'adapter à mes besoins. J'ai compris la logique mais je ne suis pas alaise pour déchiffrer totalement le code (pas encore).
    Donc, comme tu me l'as indiqué, je fais une première requête pour compter le nombre Max de semaine, là c'est bon, j'ai la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if($lastTSI == null) {
                $table == '0'; // Si pas de TSI, on met "0"
            }
    J'obtiens alors le nombre de semaine dans une variable et je peux utiliser cette variable pour le tableau?
    Pour le décalage, je ne sais vraiment pas !!! j'ai compris le principe de " si pas de TSI mais 0" mais comment coder et ou le placer?
    je pensais à çà mais sans conviction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if($lastTSI == null) {
                $table == '0'; // Si pas de TSI, on met "0"
            }

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Bonjour CosmoKnacki,

    Merci pour ta réponse. Pour commencer, je suis d'accord avec toi sur le faite de travailler sur la modélisation des bases de donnée et pas que d'ailleurs.
    Je suis peut-être trop ambitieux surtout que je rencontre problème sur problème. Enfin je vais continuer d'apprendre petit à petit.

    Donc pour toi, en l'état actuel de mes connaissances, ce serais trop compliqué pour moi ? Je commence à me le dire aussi.
    Je ne veux pas abuser de votre temps ou vous le faire perdre et je vous remercie pour les retours que vous m'avez faits.
    Je vais continuer mais en commençant par le commencement

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Le plus simple est que tu te construise un tableau de données consolidées à partir de ce que tu reçois de la base de données :

    Tu connais ton nombre de semaine , i lte faut le nombre de joueur puis tu fait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for($i = 0 ; $i < $nbjoueurs; $i++) {
    	for($j = 0 ; $j < $nbsemaines; $j++) {
    		// Si j'ai des données pour ce joueur cette semaine j'ajoute dans mon nouveau tableau
    		// Sinon je creer une données vide ou à 0
    	}
    }
     
    // Ensuite même logique qu'avant pour créer le table html

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Bonjour et merci Grunk pour ton aide ainsi que CosmoKnacki.
    Je vais suivre ta proposition et le reste du code que vous m'aviez donner.
    Si j'y arrive, je posterais le résultat pour les novices comme moi.

  13. #13
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Quelque chose comme ceci ? :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select 
        `ID du joueur`
        ,Nom
        /*concat('[',group_concat(`Semaines au club`),']') as 'Semaines'
        ,concat('[',group_concat(`TSI`),']') as 'TSI',*/
        ,json_extract(concat('[',group_concat(`TSI`),']'),"$[1]") as `1`
        ,json_extract(concat('[',group_concat(`TSI`),']'),"$[2]") as `2`
        ,json_extract(concat('[',group_concat(`TSI`),']'),"$[3]") as `3`
        ,json_extract(concat('[',group_concat(`TSI`),']'),"$[4]") as `4`
        /*... la même chose ici pour les autres semaines...*/
        ,json_extract(concat('[',group_concat(`TSI`),']'),concat("$[",json_length(concat('[',group_concat(`TSI`),']'))-1,"]")) as `dernière semaine`
    from table_hattrick_2 group by `ID du joueur`;

    Le résultat est :

    ID du joueur Nom 1 2 3 4 Dernière semaine
    445480514 Gerald Schweiger 3820 3450 NULL NULL 3450
    452461629 Clément Ramassamy 0 0 0 0 0
    452461633 Jean-Baptiste Bos 2010 2460 2270 2320 1070
    452461637 Bastien Gaultier 1850 1670 1520 1400 3900
    452461643 Alexis Lemercier 3560 3510 1360 2500 2960
    452461644 Alban Noël 3100 2970 2870 2800 3630
    452461647 Adrien Boé 1040 1030 980 960 880

    Là tu n'as plus besoin de filtrer le résultat en php, sauf de remplacer NULL par 0 (c'est faisable aussi avec un case et sans php) et le tour est joué.

    La partie des semaines est un peu répétitive oui... mais tu peux la simplifier si tu utilises une procédure stockée.

    En espérant que cela t'aidera ...

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Merci Toufik et les autres membres. Vous êtes de vrai Pro et j'aurais aimé avoir vos connaissances indiscutables.

  15. #15
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Bon, j'ai donné forme humaine à cette base de données pour illustrer mes propos précédents (il reste à faire, il manque certaines données et des contraintes d'unicité mais l'idée est là):

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    START TRANSACTION;
     
    DROP DATABASE IF EXISTS db_hattrick;
     
    CREATE DATABASE db_hattrick
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_0900_as_cs;
     
    USE db_hattrick;
     
    CREATE TABLE t_player(
        plr_id INT PRIMARY KEY,
        plr_name VARCHAR(30) NOT NULL,
        plr_fname VARCHAR(30) NOT NULL,
        plr_dob DATE
    ) ENGINE=InnoDB;
     
    CREATE TABLE t_skill_set(
        sks_id INT PRIMARY KEY AUTO_INCREMENT,
        sks_keeper INT NOT NULL,
        sks_defending INT NOT NULL,
        sks_playmaking INT NOT NULL,
        sks_winger INT NOT NULL,
        sks_passing INT NOT NULL,
        sks_scoring INT NOT NULL,
        sks_set_pieces INT NOT NULL
    ) ENGINE=InnoDB;
     
    CREATE TABLE t_record(
        rec_id INT PRIMARY KEY AUTO_INCREMENT,
        rec_datetime DATETIME NOT NULL
    ) ENGINE=InnoDB;
     
    CREATE TABLE t_condition(
        cdn_id INT PRIMARY KEY AUTO_INCREMENT,
        cdn_tsi INT NOT NULL,
        cdn_form INT NOT NULL,
        cdn_stamina INT NOT NULL
    ) ENGINE=InnoDB;
     
    CREATE TABLE t_history(
        fk_rec_id INT NOT NULL,
        fk_plr_id INT NOT NULL,
        fk_sks_id INT NOT NULL,
        fk_cdn_id INT NOT NULL,
     
        PRIMARY KEY (fk_plr_id, fk_rec_id),
     
        FOREIGN KEY (fk_rec_id) REFERENCES t_record(rec_id),
        FOREIGN KEY (fk_plr_id) REFERENCES t_player(plr_id),
        FOREIGN KEY (fk_sks_id) REFERENCES t_skill_set(sks_id),
        FOREIGN KEY (fk_cdn_id) REFERENCES t_condition(cdn_id)
    ) ENGINE=InnoDB;
     
    INSERT INTO t_player(plr_id, plr_name, plr_fname, plr_dob)
    VALUES
        (452461647, 'Boé', 'Adrien', '1993-01-29'),
        (452461644, 'Noël', 'Alban', '1996-12-28'),
        (452461643, 'Lemercier', 'Alexis', '1992-01-01'),
        (452461637, 'Gaultier', 'Bastien', '1997-02-01'),
        (445480514, 'Schweiger', 'Gérald', '1998-12-21'),
        (452461629, 'Ramassamy', 'Clément', '1978-01-11'),
        (452461633, 'Bos', 'Jean-Baptiste', '2000-11-28')
    ;
     
    INSERT INTO t_condition(cdn_tsi, cdn_form, cdn_stamina)
    VALUES
    	# Adrien Boé
        (880, 5, 5), (1010, 7, 5), (950, 6, 5), (960, 6, 5), (980, 6, 5), (1030, 6, 5), (1040, 6, 5),
        (1040, 6, 5), (990, 6, 5), (970, 6, 5), (840, 6, 5), (1010, 7, 5), (880, 5, 5), (760, 4, 5),
        (920, 5, 5), (1020, 6, 5), (910, 5, 5),
     
        # Alban Noël
        (2220, 6, 6), (2670, 7, 6), (2800, 7, 6), (2870, 7, 6), (2970, 7, 6), (3100, 7, 6), (3320, 7, 6),
        (3400, 7, 6), (3630, 7, 6), (3440, 6, 6), (3630, 6, 6), (3800, 7, 6), (3860, 6, 6), (4520, 7, 6),
        (4880, 7, 6), (4410, 6, 6), (4070, 5, 6),
     
        # Alexis Lemercier
        (1360, 5, 7), (2500, 8, 7), (2650, 6, 7), (2720, 6, 7), (2850, 7, 7), (3020, 7, 7), (3050, 7, 7),
        (3110, 7, 7), (2780, 7, 7), (2960, 7, 7), (2970, 7, 7), (3060, 7, 7), (3080, 7, 7), (3220, 7, 7),
        (3510, 7, 7), (3510, 7, 7), (3560, 7, 7),
     
        # Bastien Gaultier
        (710, 5, 6), (830, 6, 6), (1300, 7, 6), (1400, 7, 6), (1520, 6, 6), (1670, 6, 6), (1850, 6, 6),
        (1890, 6, 6), (1960, 5, 6), (2010, 6, 6), (2030, 6, 6), (1690, 4, 6), (1610, 3, 6), (2620, 5, 6),
        (2940, 6, 6), (3430, 6, 6), (3900, 7, 6),
     
        # Gérald Schweiger
        (4390, 7, 8), (3820, 5, 8), (3450, 4, 8),
     
        # Clément Ramassami
        (0, 3, 4), (0, 3, 2), (0, 3, 1), (0, 3, 1), (0, 3, 1), (0, 2, 1), (0, 2, 1),
        (0, 2, 1), (0, 2, 1), (0, 3, 1), (0, 4, 1), (0, 4, 1), (0, 4, 1), (0, 4, 1),
        (0, 3, 1), (0, 2, 1), (0, 4, 1),
     
        # Jean-Baptiste Bos
        (1070, 7, 7), (2150, 6, 7), (2440, 5, 7), (2370, 5, 7), (2570, 6, 7), (2590, 6, 6), (2440, 6, 6),
        (2330, 5, 6), (2320, 5, 6), (2270, 5, 6), (2460, 6, 6), (2010, 4, 6)
    ;
     
     
    INSERT INTO t_skill_set(sks_keeper, sks_defending, sks_playmaking, sks_winger, sks_passing, sks_scoring, sks_set_pieces)
    VALUES
        (1, 3, 4, 4, 6, 6, 3),
        (1, 5, 6, 7, 6, 3, 5), (1, 5, 7, 7, 6, 3, 5), (1, 5, 8, 7, 6, 3, 5),
        (1, 6, 6, 6, 4, 3, 3), (1, 7, 6, 6, 4, 3, 3), (1, 7, 7, 6, 4, 3, 3),
        (1, 5, 6, 4, 5, 1, 4), (1, 5, 7, 4, 5, 1, 4), (1, 5, 8, 4, 5, 1, 4), (1, 5, 9, 4, 5, 1, 4),
        (1, 2, 5, 5, 4, 8, 4),
        (1, 1, 2, 1, 1, 2, 3), (1, 1, 1, 1, 0, 1, 3), (0, 0, 0, 0, 0, 0, 2), (0, 0, 0, 0, 0, 0, 1),
        (1, 7, 4, 3, 5, 3, 6), (1, 8, 4, 3, 5, 3, 6), (1, 9, 4, 3, 5, 3, 6)
    ;
     
    INSERT INTO t_record(rec_datetime)
    VALUES
        ('2020-07-21 11:22:47'),
        ('2020-07-28 09:45:54'),
        ('2020-08-06 16:38:10'),
        ('2020-08-07 06:54:47'),
        ('2020-08-14 08:48:24'),
        ('2020-08-21 10:44:50'),
        ('2020-08-28 09:42:36'),
        ('2020-09-07 09:37:15'),
        ('2020-09-11 09:35:02'),
        ('2020-09-19 10:30:40'),
        ('2020-09-25 14:15:11'),
        ('2020-10-02 09:29:35'),
        ('2020-10-09 09:28:40'),
        ('2020-10-23 09:14:02'),
        ('2020-10-30 10:28:42'),
        ('2020-11-06 09:28:27'),
        ('2020-11-13 09:35:02')
    ;
     
     
    INSERT INTO t_history(fk_rec_id, fk_plr_id, fk_sks_id, fk_cdn_id)
    VALUES
        # Adrien Boé
        (1, 452461647, 1, 1), (2, 452461647, 1, 2), (3, 452461647, 1, 3), (4, 452461647, 1, 4), (5, 452461647, 1, 5),
        (6, 452461647, 1, 6), (7, 452461647, 1, 7), (8, 452461647, 1, 8), (9, 452461647, 1, 9), (10, 452461647, 1, 10),
        (11, 452461647, 1, 11), (12, 452461647, 1, 12), (13, 452461647, 1, 13), (14, 452461647, 1, 14), (15, 452461647, 1, 15),
        (16, 452461647, 1, 16), (17, 452461647, 1, 17),
     
        # Alban Noël
        (1, 452461644, 2, 18), (2, 452461644, 2, 19), (3, 452461644, 2, 20), (4, 452461644, 2, 21), (5, 452461644, 2, 22),
        (6, 452461644, 2, 23), (7, 452461644, 3, 24), (8, 452461644, 3, 25), (9, 452461644, 3, 26), (10, 452461644, 3, 27), 
        (11, 452461644, 3, 28), (12, 452461644, 3, 29), (13, 452461644, 3, 30), (14, 452461644, 3, 31), (15, 452461644, 4, 32), 
        (16, 452461644, 4, 33), (17, 452461644, 4, 34),
     
        # Alexis Lemercier
        (1, 452461643, 5, 35), (2, 452461643, 6, 36), (3, 452461643, 6, 37), (4, 452461643, 6, 38), (5, 452461643, 6, 39),
        (6, 452461643, 6, 40), (7, 452461643, 6, 41), (8, 452461643, 6, 42), (9, 452461643, 6, 43), (10, 452461643, 7, 44),
        (11, 452461643, 7, 45), (12, 452461643, 7, 46), (13, 452461643, 7, 47), (14, 452461643, 7, 48), (15, 452461643, 7, 49),
    	(16, 452461643, 7, 50), (17, 452461643, 7, 51),
     
        # Bastien Gaultier
        (1, 452461637, 8, 52), (2, 452461637, 8, 53), (3, 452461637, 9, 54), (4, 452461637, 9, 55), (5, 452461637, 9, 56),
        (6, 452461637, 9, 57), (7, 452461637, 9, 58), (8, 452461637, 9, 59), (9, 452461637, 10, 60), (10, 452461637, 10, 61), 
        (11, 452461637, 10, 62), (12, 452461637, 10, 63), (13, 452461637, 10, 64), (14, 452461637, 10, 65), (15, 452461637, 10, 66),
        (16, 452461637, 11, 67), (17, 452461637, 11, 68),
     
        # Gérald Schweiger
        (15, 445480514, 12, 69), (16, 445480514, 12, 70), (17, 445480514, 12, 71), 
     
        # Clément Ramassamy
        (1, 452461629, 13, 72), (2, 452461629, 14, 73), (3, 452461629, 15, 74), (4, 452461629, 15, 75), (5, 452461629, 15, 76),
        (6, 452461629, 15, 77), (7, 452461629, 15, 78), (8, 452461629, 15, 79), (9, 452461629, 15, 80), (10, 452461629, 15, 81), 
        (11, 452461629, 15, 82), (12, 452461629, 15, 83), (13, 452461629, 15, 84), (14, 452461629, 16, 85), (15, 452461629, 16, 86),
        (16, 452461629, 16, 87), (17, 452461629, 16, 88),
     
        # Jean-Baptiste Bos
        (1, 452461633, 17, 89), (2, 452461633, 18, 90), (3, 452461633, 19, 91), (4, 452461633, 19, 92), (5, 452461633, 19, 93),
        (6, 452461633, 19, 94), (7, 452461633, 19, 95), (8, 452461633, 19, 96), (9, 452461633, 19, 97), (10, 452461633, 19, 98),
        (11, 452461633, 19, 99), (12, 452461633, 19, 100)
    ;
    COMMIT;

    Code php : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf8" />
            <title>hattrick: Team TSI</title>
            <style>
    * { font-family: monospace; }
    table, td, tr { border: 1px solid #BBB; }        
            </style>
        </head>
        <body>
    <?php    
    $host = '127.0.0.1';
    $port = 3306;
    $db = 'db_hattrick';
    $charset = 'utf8mb4';
    $user = '';
    $pass = '';
     
    $dsn = "mysql:host=$host:$port;dbname=$db;charset=$charset";
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false
    ];
     
    try {
        $pdo = new PDO($dsn, $user, $pass, $options);
    } catch (\PDOException $e) {
        throw new \PDOException($e->getMessage(), $e->getCode());
    }
     
    $query = <<<'SQL'
    WITH x AS (
      SELECT plr_id, plr_name, plr_fname,
             rec_id, rec_datetime
      FROM t_player
      CROSS JOIN t_record
    ) 
    SELECT x.plr_name AS 'Name',
           x.plr_fname AS Forname,
           GROUP_CONCAT(COALESCE(c.cdn_tsi, '') ORDER BY x.rec_datetime) AS TSI
    FROM t_history h
    RIGHT JOIN x 
      ON x.plr_id = h.fk_plr_id
      AND x.rec_id = h.fk_rec_id
    LEFT JOIN t_condition c
      ON h.fk_cdn_id = c.cdn_id
    GROUP BY x.plr_id
    ORDER BY x.plr_name, x.plr_fname
    SQL;
     
    $stmt = $pdo->query($query);
    ?>        <table>
    <?php
     
    while ($row = $stmt->fetch()):
    ?>            <tr>
                    <td><?=$row['Name']?></td>
                    <td><?=$row['Forname']?></td>
                    <td><?=str_replace(',', '</td><td>', $row['TSI'])?></td>
                </tr> 
    <?php endwhile; ?>
            </table>
        </body>
    </html>

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Gros travail de fait, je te remercie CosmoKnacki.
    Je vais tester tous çà et essayer de comprendre aussi mais je suis une fois de plus impressionné.
    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2016, 18h30
  2. tableau de valeurs sans doublons à arrondis
    Par fraid49 dans le forum Général Python
    Réponses: 6
    Dernier message: 15/10/2009, 10h19
  3. filtre colonnes non contigues, sans doublons
    Par JYL74 dans le forum Excel
    Réponses: 5
    Dernier message: 14/11/2008, 11h57
  4. Tableau sans doublons
    Par raph707 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 19/02/2007, 15h59
  5. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 13h43

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