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

PHP & Base de données Discussion :

Retirer les doublons lors de l'affichage en php [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut Retirer les doublons lors de l'affichage en php
    Bonjour je viens vers vous car j'ai un problème
    j'ai une requete qui m'affiche la liste des demandes traitées et la charge par site, sachant que j'ai plusieurs site je vous donne un exemple sur deux sites
    Affichage actuel

    Demande|libelle|Site|Charge Alf|Charge CSA|
    123| Dev| ALF| 0,1| 0|
    123| Dev| CSA| 0 | 0,2|

    j'aimerai avoir au final
    Demande|libelle|Charge Alf|Charge CSA|
    123| Dev| 0,1 | 0,2|

    Mon problème se trouve au niveau de l'affichage j'aimerai faire pouvoir éliminer les doublons dans mon code php.
    En faisant un DISTINCT dans ma requete je vais prendre la deuxieme ligne.

    J'ai essayé des fonctions comme array_unique, et aussi array_sum mais la colonne reste vide

    je vous montre mon code en esperant que vous pourrez me mettre sur une piste

    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
    41
     
    $res=$bdd->query($sql);
    $nbr=$bdd->num_rows($res);
    if ( $nbr > 0 ) {
     
    //entete du tableau
    echo '<br/><br/><table border="1">';
    echo '<tr>';
    echo '<tr>';
    echo '<th>Demande</th>';
    echo '<th>Libelle </th>';
    echo '<th>Site</th>';
    echo '<th>Charge Alf</th>';
    echo '<th>Charge CSA</th>';
    echo '</tr>';
     
    while ($row=$bdd->fetch_array($res)) {
    	echo '<tr>';
            echo '<td>'.la_case($row['DemandeClient']).'</td>';
            echo '<td>'.la_case(extract_lib($row['Libelle'])).'</td>';
            echo '<td>'.la_case($row['Site']).'</td>';
     
    if ($row['Site']=='ALF') {
            echo '<td>'.la_case(round($row['Charge'],2),TRUE).'</td>';
            }
            else {
            echo  '<td>'.la_case('0').'</td>';
             }
     
     if ($row['Site']=='CSA') {
             echo '<td>'.la_case(round($row['Charge'],2),TRUE).'</td>';
            }
             else {
                echo  '<td>'.la_case('0').'</td>';
            }
    }
     
    echo '</table>';
    	}
     
    	$i++;
    Si quelqu'un a une idée je suis preneur. Merci d'avance

  2. #2
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Le mieux et le plus simple serait de le faire par une requête mySQL. Est-ce que tu y as accès ou es-tu obligé de travailler à partir du résultat de celle-ci?

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Merci tse_jc pour ta réponse. En faite ma requête me donne déjà le résultat dont j'ai besoin, il faut juste changer l'affichage.
    Je vous montre ma requête

    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
     
    SELECT demande_ou_projet.IdClientDemande
                AS DemandeClient, forfait_budget.CODE_FORFAIT_BUDGET
                AS Projet, demande_ou_projet.Type_demande
                AS Cor_Evo,
                SUM(ordre_de_travail.charge_consommee_totale)
                AS Charge, DATE_FORMAT(demande_se_trouve_dans_etat.Date_entree, '%Y/%m/%d')
                AS Date_cloture,
                LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(demande_ou_projet.Libelle,'|', -1),'|', 1),60)
                AS Libelle, ressource_tma.Equipe
                AS Site, demande_ou_projet.Reponse_technique
                AS Obervation, SUBSTRING_INDEX(SUBSTRING_INDEX(demande_ou_projet.Libelle,'|', -2),'|', 1)
                AS Pays, SUBSTRING_INDEX( SUBSTRING_INDEX( demande_ou_projet.Libelle , 'CALL', -1 ) , '|', 1 )
                AS NumCall, charge_vendue
                AS ChargeVendu
                FROM (sous_systeme
                INNER JOIN (forfait_budget
                INNER JOIN (demande_ou_projet
                INNER JOIN ordre_de_travail
                ON demande_ou_projet.IdDemande = ordre_de_travail.IdDemande)
                ON (ordre_de_travail.ID_FORFAIT_BUDGET = forfait_budget.ID_FORFAIT_BUDGET)
                AND (forfait_budget.ID_FORFAIT_BUDGET = demande_ou_projet.REF_FORFAIT_BUDGET))
                ON sous_systeme.IdSousSyst = forfait_budget.REF_SOUS_SYSTEME)
                INNER JOIN demande_se_trouve_dans_etat
                ON demande_ou_projet.IdDemande = demande_se_trouve_dans_etat.IdDemande
                INNER JOIN ressource_tma
                ON ordre_de_travail.Ressource = ressource_tma.IdRessource
                WHERE (((ordre_de_travail.charge_consommee_totale)<>0)
                AND (demande_se_trouve_dans_etat.Date_entree)
                Between '2011-05-01' And '2011-05-30'
                AND (forfait_budget.ID_FORFAIT_BUDGET='149')
                AND (demande_se_trouve_dans_etat.Code_etat='TER'))
    	    GROUP BY demande_ou_projet.IdClientDemande, ressource_tma.Equipe
    Je vous explique déjà ce que j'ai eu à faire pour avoir ce resultat.
    En rajoutant le DISTINCT je perds la seconde ligne.
    En retirant le GROUP BY j'obtiens une seule ligne du à la Somme(SUM) vu que je dois cummulé les charges.
    Un ORDBER BY m'affichera plus de doublons.
    Après il me reste une autre option créer une requete par site(une vue ou table temporaire) en rajoutant dans le WHERE ressource_tma.Equipe='ALF' idem pour les autres sites.
    Pour faire un select sur le nom de ma vue ou de ma table temporaire
    Mais cette méthode est trop lourd à gérer.
    J’espère que j'ai pu répondre ta question pourquoi je dois faire le tri en php.

    N'hesitez pas me proposer d'autre conseil, perso sa fait 3 jours que je suis dessus et je vois pas trop comment et pourrai simple

  4. #4
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    J'aimerais éviter vu la nature des tables de te demander un show create table de ta structure, et le rôle de chaque table de ta requête ne m'apparaissant pas clairement, pourrais-tu m'expliquer un peu le rôle des tables que tu utilises plus précisément stp?

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Je vais vous donner un peu plus d'explication

    Ma requête me sort un certain nombre de demande traité sur une période bien précise et sur certain site. J'ai juste simplifié le petit schémas
    Explication
    Prenons le cas un projet informatique par exemple
    Pour une même demande l'analyse peut être faite à Paris et le développement à Lyon par exemple et les testes et validation à Paris
    cela nous donnera dans notre tableau
    Demande|libelle|Site|Charge Paris|Charge Lyon|
    123 ANA Paris 0.5 0
    123 DEV Lyon 0 2
    123 Test Paris 0.1 0

    Le but est de pouvoir faire la somme des différentes charges effectuées sur une demande se qui nous donne

    Demande|libelle|Site|Charge Paris|Charge Lyon|
    123 ANA Paris 0.6 0
    123 DEV Lyon 0 2

    Objectif final est d'avoir la colonne si on peut l'enlevé sa pose pas de probleme
    Demande|libelle|Site|Charge Paris|Charge Lyon|
    123 ANA xx 0.6 2

    Quelque explication sur les tables maintenant.
    La table demande_ou_projet est ma table principe elle comporte le champs(IdDemandeClient) qui représentent ma demande, après la table
    forfait qui est utilisée pour différent type de forfait elle est indispensable quelle me permet d'etablir mon filtre sur la requête, demande_se_trouve_dans_etat utilisé pour voir les demandes qui on été terminé,
    je l'utilise aussi dans mes filtres puis la table ressource_tma que j'utilise pour retrouver le site sur lequel la demande à été traité, la table sous_systeme
    je l'utilise comme une table intermédiaire pour accéder à une table, comme t'as pu le voir elle n'est pas utilisé dans le SELECT.


    J'espère que cela réponds à ta question.
    Mon problème c'est la partie php je pense qu'il n'y a pas de problème dans le sql mais bon je me trompe peut être :-)

    Surtout n'hesite pas si tu veux plus de précision

  6. #6
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Merci pour ces précisions. M'en reste une ^^ le rôle de la table sous-système au niveau conceptuel. C'était justement celle-ci qui avait besoin le plus d'explications

    Ensuite au niveau rendu, tu souhaites avoir la charge totale tout site confondu, ou simplement par site? (besoin réel)

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    c'est simplement la somme par site.
    Pour info j'arrive déjà à le faire la somme par site depuis SQL, grace à la SUM et j'arrive à les classer grace au GROUP BY demande, site.
    Le problème c'est qu'une fois qu'une demande à été traité sur un autre site j'ai deux lignes qui s'affiche.
    Moi j'aimerai avoir au final une seule ligne au lieu de deux pour la même demande.
    Aujourd'hui pour avoir l'affichage que j'ai j'utilise des if comme ici

    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
     
    if ($row['Site']=='Paris') {
                echo '<td>'.la_case(round($row['Charge'],2),TRUE).'</td>';
                }
                else {
                echo  '<td>'.la_case('0').'</td>';
            }
     
            if ($row['Site']=='Lyon') {
          echo '<td>'.la_case(round($row['Charge'],2),TRUE).'</td>';
            }
         else {
                echo  '<td>'.la_case('0').'</td>';
            }
     
            if ($row['Site']=='Amiens') {
                 echo '<td>'.la_case(round($row['Charge'],2),TRUE).'</td>';
            }
         else {
                echo  '<td>'.la_case('0').'</td>';
            }
    Petit schemas
    Demande|libelle|Site|Charge Paris|Charge Lyon|
    123 ANA Paris 0.5 0
    123 DEV Lyon 0 2
    123 Test Paris 0.1 0

    Donc lors de l'execusion de la requete j'ai toute mes données qui s'affiche à moi de faire un second filtre en php pour avoir au final ce resultat.

    Demande|libelle|Site|Charge Paris|Charge Lyon|
    123 ANA Paris 0.6 0.2
    Je crois qu'une boucle pourrai résoudre mon problème mais je vois pas trop comment . Parce que le If il va regarder juste ligne par ligne

  8. #8
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Re,

    Merci pour tes explications, même si je n'ai toujours pas d'infos concernant ta table sous-système. Excuse-moi de persister du côté de la résolution de ta requête, car c'est de loin la meilleure approche sur tous les plans pour ton applicatif.

    Donc, permet moi de reformuler ta question, et dis-moi si je me trompe quelque part.

    Tu cherches à connaître, pour chaque demande initiée dans une période donnée, terminée, et appartenant à un forfait donné, la charge totale de réalisation par site.

    Si ma formulation est bonne, cela résume ton cahier des charges précisément pour établir ta requête dans de bonnes conditions.

    De plus, si ma formulation est exacte, j'ai peur que ta db souffre d'un problème de normalisation et que ta requête te donne des résultats erronés par rapport à ce que tu cherches à en faire car elle a été visiblement conçue pour optimiser d'autres résultats (que tu n'as pas besoin ici), où alors j'ai pas toutes les infos. Quoiqu'il en soit, si ma formulation est exacte, peux-tu me répondre aux questions suivantes:
    1) à quelle table appartient le champ "charge_vendue"?
    2) comment se définie la charge totale par site par rapport aux champs charge_vendue et charge_consomée_totale?

    ++

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Ta formulation est tout simplement correcte.

    Je vais déjà te présenter la structure de la table sous_systeme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     IdSousSyst varchar(8)                
      NomSousSyst varchar(30)             
      IdAppli varchar(8)                 
      Version varchar(15)           
      CODE_TYPE_CRITICITE varchar(10)
    selon le champs IdAppli est utilisé dans ma requête car tu peux avoir différente type d'application mais ici le filtre s'effectue uniquement sur les
    application de type "DEV", cette table est en relation avec la table forfait_budget (REF_SOUS_SYSTEME).
    J’espère que cette fois c'est un peu plus claire.

    Pour répondre à ta seconde question concernant le champs charge_vendu elle appartient à la table (demande_ou_projet).
    Pour la deuxième question la charge totale par site
    La charge_consommée_totale c'est la somme de tout les charges effectué sur une demande sans prise en compte du site sur lequel il a été traité
    Quant à la charge vendu il y a deja un calcul qui est fait elle est obtenue en faisant la différence dans différence entre la charge_consommee_total et le reste_a_faire.
    La valeur est deja renseignée par un autre outil qui gère l'insertion des demandes.

    Pour ce qui s'agit de la base donnée elle a été conçu il y a de cela quelque année elle doit avoir 10 ans d’après ce qu'on ma fait savoir. Il y a sûrement des choses à corriger mais à ce niveau c'est pas vraiment à moi de le faire,
    je suis doit mettre un outil de reporting pour faire ressortir les données dont ils ont besoin .

    En tout cas merci pour tes interventions et n’hésite pas à poser ou proposer des solutions.
    Je vais voir si je peux pas optimiser ma requêtes histoire d'avoir moins de table possible mais je pense pas que cela pourra résoudre mon problème d'affichage :-)

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Bonjour j'ai finalement trouvé la solution
    ce que je voulais faire n'était pas possible avec une seule requête.
    J'ai du le faire en 3 requêtes

    une première requête pour retrouver la demande en appliquant un DISTINCT pour éviter tout les doublons.
    La seconde à partir de la demander qui me permettra de retrouver toute les charges lié à cette demande et par site ou j'effectue ma somme

    Puis une troisième et dernière requête pour afficher la demande et la charge de chaque site et le tout sur une seule ligne .

    Merci à tse_jc qui a passé du temps à comprendre mon problème


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

Discussions similaires

  1. modifier les valeurs lors de l'affichage!
    Par NedaRyme dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2008, 16h06
  2. Retirer les doublons de dates
    Par Mister Nono dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 22/10/2007, 11h26
  3. [MySQL] Comment enlever des doublons lors de l'affichage d'un tableau dynamique ?
    Par wylls dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/12/2006, 14h54
  4. Retirer les doublons du résultat
    Par Mister Nono dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/10/2006, 12h47
  5. Réponses: 7
    Dernier message: 25/07/2005, 13h41

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