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 :

requête de regroupement


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut requête de regroupement
    Bonjour à tous,

    J'espère ne pas faire rire de moi avec cette question qui, je croyais très simple mais je tourne en rond et n'y parvient pas.

    Je cherche à regrouper des infos qui parviennent tous de la même table. Ma table contient les champs suivants :

    id, agent, nomdudossier, dateouverture, datefermeture
    1, Jerome, Affaire couture, 2014-01-01, 2015-02-01
    2, Jerome, Affaire Maltais, 2014-06-01, 2014-08-30
    3, Anabelle, Affaire Levesque, 2014-08-01, null

    Ce que souhaite faire, c'est lister les dossiers par agent par exemple :
    Agent : Jérome
    1, Affaire couture, 2014-01-01, 2015-02-01
    2, Affaire Maltais, 2014-06-01, 2014-08-30

    Agent : Anabelle
    3, Affaire Levesque, 2014-08-01, null

    C'est une base postgresql. J'ai lu sur pg_fetch_assoc, les while et foreach mais je tourne en rond et n'arrive à rien....

    Quelqu'un pour m'aider ??

  2. #2
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    ce que je peux te proposer pour aborder ton cas :

    - tu fais une première requête pour récupérer les différents noms de tes agents (Jérome, Anabelle etc ...).
    - Pour chaque agent tu fais une requête pour récupérer toutes les infos dont tu as besoin à l'aide de son nom
    - Puis tu affiches les résultats pour chaque agent

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'avais pensé à cette option mais j'aurais cru qu'il pourrait exister une façon de récupérer le tout en une seule requête plutôt que de faire rouler une rêquete sur la même table autant de fois qu'il existe d'agents (j'ai effectivement plusieurs agents)...

    D'autres pistes ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    en une seule requête j'avais au début pensé à un 'GROUP BY agent', mais tu n'auras pas toutes les infos désirées, peut-être qu'il existe une façon de faire un GROUP BY et de concaténer tous les champs mais je ne connais pas ...

    Sinon tu peux le faire avec la requête que tu as faite mais il faut alors trier ton résultat dans un tableaux multidimensionnel avant de l'afficher. ça donnerait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $infosAgent = array();
     
    while( $line = pg_fetch_assoc( $result ) ) {
    $key = $line['agent'];
    $infosAgent[$key]['id'][] = $line['id'];
    $infosAgent[$key]['nomdudossier'][] = $line['nomdudossier'];
    // pareil pour tous les attributs...
    }
    Comme ça pour chaque agent, tu as un tableau contenant tous les ids, avec les champs correspondants. Tu n'auras plus qu'à les afficher en parcourant le tableau $infosAgent

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Une approche simple est de ne pas se soucier de renvoyer x fois le nom de l'agent dans la requête. Il suffit d'ajouter order by agent à la fin de la requête pour simplifier ensuite le travail coté PHP (comme les enregistrements sont classés par ordre d'agent, il suffit de tester quand l'agent change):
    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
    $query = 'select agent, id, nomdudossier, dateouverture, datefermeture from matable order by agent;';
    /* dans cette requête on place  la colonne "agent" en première place pour pouvoir
        l'enlever avec array_shift et utiliser vprintf avec ce qui reste (voir le manuel php) */
     
    $result = pg_query($dbconn, $query);
     
    if (!$result) {
        echo "échec de le requête.\n";
        exit;
    }
     
    $format = "\nid: %3d    dossier: %-20s ouverture: %-15s fermeture: %s";
     
    echo '<pre>';
     
    $agent = false;
    while ($rec = pg_fetch_assoc($result)) {
        $temp = array_shift($rec);
        if ($agent !== $temp) {
            $agent = $temp;
            echo "\n\nAgent: " . $agent;
        }
        vprintf($format, $rec);
    }
     
    echo '</pre>';
    Une autre possibilité est d'utiliser les fonctions d'agrégations de PostgreSQL comme par exemple json_agg pour pouvoir agglutiner tous les enregistrements pour un agent. On peut alors composer une requête qui renvoie le nom de l'agent et une chaîne json avec toutes les affaires:

    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
    $query = 'select matable.agent, json_agg(row_to_json(r)) as affaires
    from matable
    cross join lateral
    	(select id, nomdudossier, dateouverture, datefermeture) r
    group by matable.agent;';
     
    $result = pg_query($dbconn, $query);
     
    if (!$result) {
        echo "échec de le requête.\n";
        exit;
    }
     
    echo '<pre>';
     
    $format = "\nid: %3d    dossier: %-20s ouverture: %-15s fermeture: %s";
     
    while ($rec = pg_fetch_assoc($result)) {
        echo "\n\nAgent: " . $rec['agent'];
     
        foreach (json_decode($rec['affaires'], true) as $affaire) {
            vprintf($format, $affaire);
        }
    }
     
    echo '</pre>';

    Remarque: un des intérêts d'utiliser une base de données relationnelle est d'éviter la redondance des données en scindant l'information dans plusieurs tables. Dans ton exemple, tout est dans une seule table, résultat chaque agent a son nom répété x fois pour chaque affaire qu'il a traité.
    Le découpage classique consiste en une table affaire(id, dossier, debut, fin), une table agent(id, nom) et une table gestion_affaire(id_affaire, id_agent) pour faire le lien entre les agents et les affaires.

    Maintenant, quitte à tout coller dans une seule et même table, autant utiliser une base NoSQL qui gérera bien plus rapidement ce genre de structure.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [Requête] [03] Regrouper 2 tables
    Par NiKoTiNe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/04/2007, 11h50
  2. [Requête][97] Regroupment du champs Date
    Par majnoune dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 17/04/2007, 16h32
  3. requête de regroupement
    Par bouba_95 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 08/01/2007, 11h30
  4. [MySQL] Problème de requête de regroupement
    Par zoom61 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/08/2006, 15h43
  5. Requête sql regroupement de dates
    Par rocs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/07/2005, 17h40

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