Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    2

    query a campi incrociati

    E' possibile con una query php riportare i dati in una tabella con i dati in parte su una riga e parte in colonna
    con il relativo conteggio ?

    es: tabella

    nome data
    ---------------------------
    bianchi | 01/01/2017
    bianchi | 01/01/2017
    bianchi | 03/01/2017
    rossi | 01/01/2017
    rossi | 02/01/2017
    rossi | 01/06/2017
    verdi | 01/01/2017
    verdi | 02/01/2017
    verdi | 05/05/2017

    Il risultato dovrebbe essere


    01/01/2017 ! 02/01/2017 ! 03/01/2017 05/05/2017 01/06/2017
    --------------------------------------------------------------------------------------------------
    rossi 1 | 1 | | 1
    verdi 1 | 1 | | 1
    bianchi 2 | | 1 |


    Ho provato con una libreria pivot trovata in rete ma non funziona oltre a risultare deprecata.
    Ho provato anche con mysql_fetch_array ma non riesco a capire come fare.

    Qualcuno può aiutarmi?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Prova questo.
    Un consiglio. Se il tuo campo data è di tipo CHAR o VARCHAR, per potere ordinare le date in maniera corretta devono avere il formato SSAAMMGG (esempio 20161031 o 2017-01-01). Se hai un formato GGMMSSAA (esempio 01/01/2017) allora non funzionerà. Il 20/02/2017 apparira prima del 31/01/2017 per esempio.

    Codice PHP:
    <?php
    define
    ('DB_HOST''127.0.0.1');
    define('DB_NAME''tests');
    define('DB_USER''root');
    define('DB_PWD' '');
    $bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $query     "SELECT `data`, `nome`,count(*) as conta FROM `tab` group by `data`,`nome` order by `data`, `nome`";
    $prepared     $bdd->prepare($query);
    $prepared->execute();
    $result       $prepared->fetchAll();
    $arrDate = array();
    $arrNomi = array();
    $arrFina = array();
    foreach(
    $result as $subArray) {
     if (!
    in_array($subArray['data'],$arrDate)) {$arrDate[] = $subArray['data'];}
     if (!
    in_array($subArray['nome'],$arrNomi)) {$arrNomi[] = $subArray['nome'];}
     
    $arrFina[$subArray['data']][$subArray['nome']] = $subArray['conta'];
    }
    ?>
    <table border="1px">
     <tr align='center' >
      <td>
      </td><?php
      
    foreach($arrDate as $key => $value) {?>
       <td><?php print $value;?></td><?php
      
    ?>
     </tr>
    <?php
     
    foreach($arrNomi as $keyNomi => $valNomi) {?>
     <tr align='center' style="border:1px solid black">  
      <td><?php print $valNomi;?></td><?php
       
    foreach($arrDate as $keyDate => $valDate) {?>
        <td><?php print (isset($arrFina[$valDate][$valNomi]) ? $arrFina[$valDate][$valNomi] : "");?></td><?php
       
    }?>
     </tr><?php
     
    }?>
    </table>
    I dati
    170219-001.JPG

    Il risultato
    170219-002.JPG
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    2
    Grazie funziona !! Mi hai risolto un grosso problema.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.