Aggragare celle di record consecutivi che hanno lo stesso valore

di il
18 risposte

Aggragare celle di record consecutivi che hanno lo stesso valore

Buongiorno a tutti,

avrei un form che scrive su due tabelle sql  collegate:

come mi è stato suggerito infatti ho una tabella master e una slave.

praticamente mi trovo che quando dal form ricevo i dati e li scrivo sulle due tabella sql, in alcuni casi con una unica query INSERT INTO, ad un singolo id_master possono corrispondere vari id_slave.

la tabella html che visualizza i dati delle due tabelle collegate, viene quindi generata da una select con  left join e ovviamente possono riportare varie righe dove il valore id_master è identico e accanto, la colonna id_slave invece ha valori progressivi univoci.

Bene. Sperando che serva a farmi capire vi mostro le due colonne alle quali ne seguono ovviamente altre ma che non ho incluso nello screenshot. 

Il punto è che i dati riportati  su questa tabella html sono il risultato della Query e del ciclo while che ripete la funzione fetch_assoc per ogni record finché ce ne sono, ma essendo che nella select c'è una join tra due tabelle, ovviamente quando ci sono id master uguali, il ciclo si ripete ugualmente perché poi ovviamente ci sono altri campi che riportano valori diversi che devo essere consultati; quindi non posso aggregare dati con funzioni sql.

Dovendo quindi agire con php, vorrei ottenere una unione delle celle che nei record consecutivi hanno lo stesso valore, per rendere anche più leggibile la tabella stessa giocando con i bordi delle celle.

Questo è lo script che genera la tabella html  attuale coi dati prelevati dal database

//blocco query al database

	$select_sql="SELECT
	gbgar_serv_master.id_master,
	id,
	autista,
	stato,
	data,
	tipologia,
	macchina,
	servizi_da_svolgere,
	note
	FROM gbgar_serv_master
	LEFT JOIN gbgar_serv_slave
	ON gbgar_serv_master.id_master=gbgar_serv_slave.id_master	
	WHERE
	data between DATE_ADD(CURDATE(), INTERVAL -30 DAY)
	and DATE_ADD(CURDATE(), INTERVAL 3 DAY);";

	//controllo sull'avvenuta esecuzione della query al database
	$risultato_select=$Conn->query($select_sql);
	if($risultato_select == FALSE){
	die("Errore nell'esecuzione della query: " . $select_sql);
	}

	/*echo"<pre>";
	print_r($risultato_select);
	echo"</pre>";*/
	

	//blocco di creazione intestazione tabella
	echo"<h1>Servizi assegnati agli autisti</h1>";
	echo 
	"<div class=\"table\">
		<table class=\"serv\">	
			<thead>
				<th class='id-reg'>ID MASTER</th>
				<th class='id-reg'>ID SERVIZIO</th>
				<th class='autista'>AUTISTA</th>
				<th class='s_d_t_m'>STATO</th>
				<th class='s_d_t_m'>DATA</th>
				<th class='s_d_t_m'>TIPOLOGIA</th>
				<th class='s_d_t_m'>MACCHINA</th>
				<th class='s_n'>SERVIZI DA SVOLGERE</th>
				<th class='s_n'>NOTE</th>
			</thead>";

	/*impostazione ciclo di prelievo dei records
	col metodo fetch_assoc viene prelevata una riga alla volta secondo i criteri impostati nelle condizioni "where" della select.*/
	

	while($records = $risultato_select->fetch_assoc()){
		$id_registro=$records["id_master"];
		$id_servizio=$records["id"];
		$autista=$records["autista"];
		$stato=$records["stato"];
		$data=$records["data"];
		$tipologia=$records["tipologia"];
		$macchina=$records["macchina"];
		$servizio_da_svolgere=$records["servizi_da_svolgere"];
		$note=$records["note"];

		
		//conversione formato data
		$timestamp_data = strtotime($data);
		$formato_data = 'd / m / Y';
		$newdate = date($formato_data,$timestamp_data);
					
			//genero e visualizzo il corpo della tabella
			echo"<tr>
					<td class='id-reg'>$id_registro</td>
					<td>$id_servizio</td>
					<td>$autista</td>
					<td>$stato</td>
					<td>$newdate</td>
					<td>$tipologia</td>
					<td>$macchina</td>
					<td>$servizio_da_svolgere</td>
					<td>$note</td>
				</tr>";
	}		
		echo"</table>"; //chiusura della class tabella
	echo "</div>"; // chiusura del div class table

	
    $Conn->close();
	
?>		
</body>
	
</html>

Spero che mi possiate aiutare perché non ho trovato molti suggerimenti googolando, non so neppure se sia possibile francamente.

Cosi a naso direi che il ciclo while dovrebbe leggere il valore corrispondente alla chiave ID_MASTER e se quella successiva è uguale non deve generare la cella ..... ma in che maniera?  booohh .

Vabbhe spero qualcuno mi possa schiarire le idee in merito.

Grazie comunque e buona giornata a tutti.

Filippo P.

18 Risposte

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    16/03/2026 - pierpippo ha scritto:

    avrei un form che scrive su due tabelle sql  collegate:

    Un form di inserimento dati?

    16/03/2026 - pierpippo ha scritto:

    praticamente mi trovo che quando dal form ricevo i dati e li scrivo sulle due tabella sql, in alcuni casi con una unica query INSERT INTO, ad un singolo id_master possono corrispondere vari id_slave.

    Quindi non stai inserendo dati manualmente ma in automatico?

    Devi prima.fare la inserti lato master poi lato detail.

    16/03/2026 - pierpippo ha scritto:

    la tabella html che visualizza i dati delle due tabelle collegate, viene quindi generata da una select con  left join e ovviamente possono riportare varie righe dove il valore id_master è identico e accanto, la colonna id_slave invece ha valori progressivi univoci.

    Ma stai ancora inserendo i dati e parli di view?

    16/03/2026 - pierpippo ha scritto:

    Bene. Sperando che serva a farmi capire vi mostro le due colonne alle quali ne seguono ovviamente altre ma che non ho incluso nello screenshot. 

    Non si vede...

    16/03/2026 - pierpippo ha scritto:

    Il punto è che i dati riportati  su questa tabella html sono il risultato della Query e del ciclo while

    Stiamo parlando di inserimento? Quale query?

    Parli di celle, stai estrapolando in una griglia?

    Fai un po' di chiarezza. 

    Vuoi, una volta inseriti/importati i dati vedere qualcosa tipo

    Master: analcolici magazzino centrale marca x

    Dettaglio:

    Lola lola zero 35pz

    Aranciata 2 PZ

    Bozza analcolica 3 PZ

    Master: alcolici magazzino centrale marca y

    Passito 3 PZ

    Glicine 2 PZ

    Inzolia 4 PZ

    Ecc....?

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Buona sera,

    partendo dal file immagine che ho allegato e che nell'editor era visibile, non capisco perché invece ora non lo sia più.

    Non ho capito perchè le immagino nell'editor vengono applicate se inserite ma poi non vengono trasmesse.

    Provo ad ovviare simulando la situazione con una tabella  "facsimile".

    id_masterid_slave
    1031
    1032
    1033

    Ora tralasciando ciò che forse ha creato più confusione che altro, facciamo conto, come poi in effetti è, che la tabella del database esiste già e viene popolata dinamicamente da un form che invia i dati inseriti ad un file, tramite $_post, e i dati vengono registratati nel database.

    La tabella inserita mostra un fac simile dello scorcio della view che avrei voluto mostrare ma a quanto pare poi ne jpg ne png vengono trasmesse .

    Lo script funziona ma come vedete dalla tabella fac simile mi da una tabella in cui viene ripetuto lo stesso id per diversi record, e questo è normale, visto il funzionamento della select.

    Il punto è che una volta impostata la query select etc.... vorrei poter unire le celle che hanno lo stesso valore, ovviamente intendo tra celle di record consecutivi in quanto la colonna con id_master può avere lo stesso valore in 2 o più record consecutivi mentre la colonna accanto: id_slave, ha sempre un id univoco.

    Quindi come scrivevo nella precedente mail per rendere più chiara e leggibile la view della tabella che nell'arco di un mese è destinata ad avere parecchie righe, vorrei poter manipolare con php la gestione della generazione delle righe e delle celle in maniera tale che accorpi appunto nella colonna id_master le celle che hanno lo stesso valore. 

    Per questo ho inserito nella mail precedente l'intero script che preleva i dati e genera la view attualmente funzionante, di cui ho riprovato a inserire lo screenshot delle prime due colonne.

    Potreste aiutarmi a capire come posso ottenere questa cosa? 

    Buona serata e grazie.

    Filippo P.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Ho modificato la sql e ne ho creato un array.

    ho fatto un mix di esempi letti nelle guide varie adattandoli a quanto hai scritto.

    questo dovrebbe soddisfare la tua richiesta. 

    <?php
    
    $CREAQUERY = "SELECT
        gbgar_serv_master.id_master,
        gbgar_serv_slave.id AS id_servizio,
        autista,
        stato,
        data,
        tipologia,
        macchina,
        servizi_da_svolgere,
        note
    FROM gbgar_serv_master
    LEFT JOIN gbgar_serv_slave
       ON gbgar_serv_master.id_master = gbgar_serv_slave.id_master
    WHERE
       data BETWEEN DATE_ADD(CURDATE(), INTERVAL -30 DAY)
       AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
    ORDER BY gbgar_serv_master.id_master, gbgar_serv_slave.id;";
    
    $ARRAYQUERY = $Conn->query($CREAQUERY);
    if($ARRAYQUERY == FALSE)
    {
        die("Errore nell'esecuzione della query: " . $CREAQUERY);
    }
    
    
    $dati = [];
    
    while($row = $ARRAYQUERY->fetch_assoc())
    {
        $dati[$row['id_master']][] = $row;
    }
    
    
    echo "<h1>Servizi assegnati agli autisti</h1>";
    echo "<div class='table'>
    <table class='serv'>
    <thead>
        <tr>
            <th class='id-reg'>ID MASTER</th>
            <th class='id-reg'>ID SERVIZIO</th>
            <th class='autista'>AUTISTA</th>
            <th class='s_d_t_m'>STATO</th>
            <th class='s_d_t_m'>DATA</th>
            <th class='s_d_t_m'>TIPOLOGIA</th>
            <th class='s_d_t_m'>MACCHINA</th>
            <th class='s_n'>SERVIZI DA SVOLGERE</th>
            <th class='s_n'>NOTE</th>
        </tr>
    </thead>";
    
    
    foreach($dati as $id_master => $righe){
    
        $rowspan = count($righe);
        $prima_riga = true;
    
        foreach($righe as $record){
    
            $timestamp_data = strtotime($record["data"]);
            $newdate = date('d / m / Y', $timestamp_data);
    
            echo "<tr>";
    
            if($prima_riga)
            {
                echo "<td class='id-reg' rowspan='$rowspan'>$id_master</td>";
                $prima_riga = false;
            }
    
            echo "
                <td>{$record['id_servizio']}</td>
                <td>{$record['autista']}</td>
                <td>{$record['stato']}</td>
                <td>$newdate</td>
                <td>{$record['tipologia']}</td>
                <td>{$record['macchina']}</td>
                <td>{$record['servizi_da_svolgere']}</td>
                <td>{$record['note']}</td>
            ";
    
            echo "</tr>";
        }
    }
    
    
    echo "</table>";
    echo "</div>";
    
    $ARRAYQUERY->free();
    $CREAQUERY = null;
    $ARRAYQUERY = null;
    $dati = [];
    
    $Conn->close();
    
    ?>
  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    17/03/2026 - sihsandrea ha scritto:

    ORDER BY gbgar_serv_master.id_master, gbgar_serv_slave.id;";

    Ciao,

    grazie infinite della risposta, la sto studiando ora, e appena riesco provo ad applicarla,

    chiedo tuttavia un chiarimento:

    la clausola citata, correggimi/correggetemi se sbaglio, non dovrebbe servire nel mio caso, in quanto per ogni compilazione del form sarà sempre registrato nelle tabelle del database, un id master progressivo (auto_increment) ed eventualmente, se una registrazione prevede servizi multipli avrò cmq un ripetersi dell'id_master su record consecutivi ai quali corrisponderanno id_servizio, sempre progressivi anch'essi ma univoci.

    ...sempre che io  non abbia capito male la ragione per cui hai aggiunto anche la clausola order by alla select.

     in ogni caso, spero di poter presto aver tempo di provare il tutto e di aggiornare questo thread spero con l'aggiunta di un bel "risolto".

    Grazie ancora e buona giornata a tutti,

    Filippo P.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Sto usando la sql come Array e voglio che sia ordinato per come voglio io. Il db non sempre ordina i dati per come li immaginiamo.

    Tutto qua....

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Ciao,

    ti ringrazio anticipatamente, lo script che mi hai suggerito funziona.

    Tuttavia non ho capito bene alcuni passaggi che ti chiederei di spiegarmi:

    in primis soprattutto questa:

    $dati[$row['id_master']][] = $row

    e di conseguenza:

    foreach($dati as $id_master => $righe){
        $rowspan = count($righe);
        $prima_riga = true;
        foreach($righe as $record){
            $timestamp_data = strtotime($record["data"]);
            $newdate = date('d / m / Y', $timestamp_data);
            echo "<tr>";
            if($prima_riga) //questo significa "se esiste $prima riga" ?
            {
                echo "<td class='id-reg' rowspan='$rowspan'>$id_master</td>";
                $prima_riga = false; qua vuoti $prima riga che si riempirà del nuovo valore nella iterazione seguente? 
      }

    insomma non ho capito bene alcuni passaggi, a parte che viene definito il valore da passare all'attributo html rowspan per ottenere l'aggregazione delle celle che hanno lo stesso valore. Quindi a monte fai il conteggio delle righe nel ciclo foreach.

    Ti chiederei cortesemente di aiutarmi a capire questi passaggi affinchè possa applicare questo script, adattandolo magari in altre situazioni.

    Grazie anticipatamente

    Filippo P

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    22/03/2026 - pierpippo ha scritto:

    in primis soprattutto questa:

    $dati[$row['id_master']][] = $row
    sintetizzando abbiamo:
    A[B['id_master']][] = C

    C contiene le righe della query. 

    B sono i raggruppamenti delle righe per idMaster

    A è una matrice che contiene le righe della query per idMaster

    22/03/2026 - pierpippo ha scritto:

    foreach($dati as $id_master => $righe)

    per i dati dell'array con chiave IdMaster creami le righe

    create le righe le conto e le assegno a rowspan

    22/03/2026 - pierpippo ha scritto:

    $rowspan = count($righe); 

    $prima_riga = true;

    e setto la prima riga a vero (non assegno nulla ne cancello ma semplicemente creo un flag per non ripetere il primo valore per i vari detail)

    la cella IDMaster viene estesa alle righe dello stesso gruppo finche' è falsa (se idmaster è 1 resta 1 appena cambia setto a true poi ritorna a false e così via per tutto l'array)

    alla prima iterazione prima riga=true, esegue l'if stampa il primo record comprensivo di idmaster e setta a false)

    settato a false viene saltato il comando di "if ($prima_riga)" che equivale a scrivere

    if primariga=true ecc.... ha lo stesso valore di if (primariga) ecc...

    quindi alla tua domanda:

    22/03/2026 - pierpippo ha scritto:

    $prima_riga = false; qua vuoti $prima riga che si riempirà del nuovo valore nella iterazione seguente?

    NO non assegno ne cancello semplicemente verifico che la prima riga sia gia' stata inserita, se si la salto (non reinserico l'id già stampato) altrimenti lo stampo.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Ok, 

    per ultimissima cosa, dal momento che dalla query effettuata dalla tabella del database estraggo, tra gli altri, anche i valori del campo "note", e che anch'esse vengono iterate quando effettuo un inserimento multiplo, alla stessa maniera nella quale mi trovo iterati i valori di id_master intendo,

    come posso fare per aggregare anche queste celle?

    Potenzialmente in caso di inserimento multiplo, a parte "id_servizio" e "servizi_assegnati"  che son valori sempre diversi, gli altri sono sempre ripetuti almeno due o tre volte per ogni registrazione;

    tuttavia  solo id_master ed eventuali note (ultima colonna) le farei aggregare ma francamente non riesco a capire come integrare le istruzioni nello script che mi hai già suggerito . Pensavo infatti che visto l'esempio, mi sarebbe stato relativamente semplice applicarlo anche ad altre colonne. 

    Purtroppo non ci sto riuscendo.

    Spero in un ulteriore tuo aiuto.

    Grazie comunque

    Filippo P.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Se primo record ok id ok note

    Fai camminare assieme sia master che note.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Rettifico... se tratti il campo note come il campo master viene fuori uno schifo...

    supposto che così sia più elegante:

    ID MASTER | SERVIZI...
              | SERVIZI...
              | SERVIZI...
    ----------------------------
    NOTE: Il campo note è vuoto
    ----------------------------
    ID MASTER | SERVIZI...
              | SERVIZI...
              | SERVIZI...
    ----------------------------
    NOTE: LOREM IPSUM...
    ----------------------------
    

    17/03/2026 - sihsandrea ha scritto:

    <table class='serv'> <thead> <tr> <th class='id-reg'>ID MASTER</th> <th class='id-reg'>ID SERVIZIO</th> <th class='autista'>AUTISTA</th> <th class='s_d_t_m'>STATO</th> <th class='s_d_t_m'>DATA</th> <th class='s_d_t_m'>TIPOLOGIA</th> <th class='s_d_t_m'>MACCHINA</th> <th class='s_n'>SERVIZI DA SVOLGERE</th> <th class='s_n'>NOTE</th> </tr> </thead>";

    da qui togli <th class='s_n'>NOTE</th>

    e qui

    17/03/2026 - sihsandrea ha scritto:

    foreach($righe as $record){ $timestamp_data = strtotime($record["data"]); $newdate = date('d / m / Y', $timestamp_data); echo "<tr>"; if($prima_riga) { echo "<td class='id-reg' rowspan='$rowspan'>$id_master</td>"; $prima_riga = false; } echo " <td>{$record['id_servizio']}</td> <td>{$record['autista']}</td> <td>{$record['stato']}</td> <td>$newdate</td> <td>{$record['tipologia']}</td> <td>{$record['macchina']}</td> <td>{$record['servizi_da_svolgere']}</td> <td>{$record['note']}</td> "; echo "</tr>"; }

    aggiungi le note controllando che non sia vuota (ti metto lo stralcio iniziale e finale del codice dove inserire le note come rigo a parte).

    ...
            echo "
                <td>{$record['id_servizio']}</td>
                <td>{$record['autista']}</td>
                <td>{$record['stato']}</td>
                <td>$newdate</td>
                <td>{$record['tipologia']}</td>
                <td>{$record['macchina']}</td>
                <td>{$record['servizi_da_svolgere']}</td>
            ";
    
            echo "</tr>";
        }
    
        // Riga NOTE unica per ogni MASTER
        $note = !empty($righe[0]['note_master']) 
            ? $righe[0]['note_master'] 
            : 'Il campo note è vuoto';
    
        echo "<tr class='note-row'>
                <td colspan='8'><strong>NOTE:</strong> $note</td>
              </tr>";
    }
    
    echo "</table>";
    echo "</div>";
    ...

    il pratica, dopo aver inserito il primo id master e le detail, inserisci il rigo delle note.

    sperando che la prossima domanda non sia un separatore dei record... ma dovresti aver capito il meccanismo.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Buon pomeriggio,

    oggi avendo avuto tempo ho introdotto quanto mi è stato suggerito e chiuderei questo argomento.

    Tuttavia non prima di aver ringraziato "Sihsandrea" della pazienza e del prezioso aiuto che mi ha dato.

    Ho ottenuto quanto volevo, ma soprattutto ho imparato una cosa che sicuramente mi sarà utilissima in futuro su come si possano manipolare la visualizzazione dei dati prelevati da un database.

    Anche circa l'idea di inserire le note in una riga dedicata, mentre continuavo a ragionare alla stessa maniera con cui volevo accorpare le celle della colonna id_master, ha introdotto ordine e leggibilità alla tabella che ora mostra le registrazioni in maniera molto chiara.  

    Sono davvero contento. 

    Grazie. 

    Filippo P. 

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Per così poco... 

    I tutorial li trovi nelle master-detail riferite a ordini, fatture ecc...

    Per adattarle basta poco.

    Lato master sono tutti dati unici quindi potresti considerare i dati da mettere come testa, il corpo è il contenuto della detail e il piede il resto della master, in questo caso ho messo le note ma potrebbero essere i totali, i dettagli iva, percentuali iva  e imponibili (nei casi che ho visto per adattarlo alla tua esigenza).

    Buon lavoro.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    Per fortuna dei potenziali clienti, questo non è il mio lavoro ma solo un hobby. ;)

    Grazie di nuovo

    Filippo P.

  • Re: Aggragare celle di record consecutivi che hanno lo stesso valore

    23/03/2026 - sihsandrea ha scritto:

    Se primo record ok id ok note

    Fai camminare assieme sia master che note.

    In ogni caso scusami se ci torno sopra, ma questa cosa non l'avrei mica capita sai.

    Nel senso, va bene che poi effettivamente le note stanno meglio posizionate in un rigo a se, ma sul momento non avevo neanche avuto tempo per applicarlo al mio script e ho subito integrato la modifica che mi hai suggerito in seguito a quella citata sopra. 

    Tuttavia mi sarebbe utile capire meglio questa cosa perché magari mi torna utile.

    Grazie e buona giornata

    Filippo P

Devi accedere o registrarti per scrivere nel forum
18 risposte