media per riga

  • Creatore Discussione Creatore Discussione carlo.c
  • Data di inizio Data di inizio
Stato
Chiusa ad ulteriori risposte.

carlo.c

Nuovo Utente
7 Dic 2020
4
0
1
Salve a tutti;
vi scrivo perchè ho un problema ad implementare 2 query;
ho cercato nel forum mysql ma non ho trovato nulla che poteva darmi uno spunto.
Vi chiedo perdono fin da subito se scriverò delle bestialità sono un neofita e mi sono avvicinato al mondo dei db da appena un mesetto
causa fermo forzato coronavirus.

Dunque, sto facendo un db per mia moglie insegnante elementare la quale ha bisogno di una tabella dove inserire i voti delle
interrogazioni;
quindi ho creato una tabella(storia) composta da id_alunni e nomi_alunni,ad essi aggiungo di volta in volta la colonna denominata
col nome della prova es.i_fenici_20_10_2020 ($sql = "ALTER TABLE storia ADD $NEW_COLUMN CHAR(4) NULL";),
e nella quale inserisco i voti relativi all'interrogazione e così via.
il problema nasce nel momento in cui devo fare la media per alunno, infatti i voti per alunno non vengono messi in colonna,
bensì in riga:

id| nome_alunno | i_fenici_20_10_2020 |i_romani_21_10_2020 | MEDIA |
1 | pippo | 8 |6 |7 |
2 | topolino | 2 | |1 |

come vedete se topolino ha saltato l'interrogazione(o compito scritto) la media viene sballata.
Quindi la mia necessità sarebbe che nel caso di topolino il valore di media rimanesse 2.

ho provato con la funzione COUNT(nome colonna), essa infatti non conta il valore nullo quindi:
$sql = "SELECT (COUNT(a)+COUNT(b)) FROM storia as MEDIA WHERE id = $id";
con tale query individuo i valori null escludendoli dall'operazione che effettua la media.

quindi ho pensato (ecco la possibile bestialità):

nella pagina in cui dovrà apparire la tabella con le medie inserisco una 1^ query dalla quale estraggo la somma dei valori not null ottenendo così
una variabile ($divisore) da inserire nella 2^ query in cui è presente l'operazione vera e propria per ottenere la media di ogni alunno in base alle effettive prove sostenute.

$sql = "SELECT ALUNNI,$NomiProve,(($ProveScolastiche)/$divisore) as MEDIA FROM storia WHERE id = $id ORDER BY ALUNNI ASC";

praticamente avrei bisogno una funzione AVG che funzioni per riga e non per colonna.

problema numero 1) non so a priori come si chiameranno le prove e quante saranno le COUNT da vagliare {(COUNT(a)+COUNT(b)},
quindi avrei bisogno di trovare un modo tipo la funzione IMPLODE DI PHP.

problema numero 2) come ottenere l'eventuale variabile da mettere a denominatore per la media.
problema numero 3) tutto filava liscio fino a che mia moglie non mi ha chiesto come voleva le medie!!!!

p.s.motore myISAM

spero di essere stato esaustivo nella spiegazione del problema fornendo tutti i dati per la risoluzione dello stesso.
allego copia della pagina in questione:

<?php
//CONNESSIONE AL DB
$dbhost = 'localhost:3306';
$dbuser = 'root';
$dbpass = '';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(!$conn) {
die('Connessione impossibile. Errore: ' . mysqli_error($conn));
}
mysqli_select_db($conn,'scuolastoria');


//RICEVO LE VARIABILI RELATIVE AI NOMI DELLE PROVE SCOLASTICHE CREATE (ES I_FENICI_22_04_2020), IL NUMERO DI PROVE SCOLASTICHE ESEGUITE FIN'ORA($divisore), L'id DI OGNI ALUNNO.
$nome_materie = $_POST['nome_materie'];
$divisore = $_POST['divisore'];
$id = $_POST['id'];

//VERIFICO CHE SI TRATTI DI ARRAY
if( is_array($nome_materie))
{
$NumeroProve = count($nome_materie);
$NomiProve = implode(',', $nome_materie);
$ProveScolastiche = implode('+',$nome_materie);
}

//CREO LA QUERY
$sql = "SELECT ALUNNI,$NomiProve,(($ProveScolastiche)/$divisore) as MEDIA FROM storia WHERE id = $id ORDER BY ALUNNI ASC";
echo $sql."<br>";

echo "La media voti è stata fatta dividendo le prove per <b style='color:red'>$divisore</b><br> ";

$result= mysqli_query($conn,$sql);
$numFields = mysqli_num_fields($result);

//VISUALIZZO LA TABELLA CON TUTTE LE PROVE ESEGUITE,
//I VOTI MESSI (E NON) E LA MEDIA FATTA DIVIDENDO LA SOMMA DEI VOTI(E NON) DI OGNI ALUNNO / IL NUMERO DI PROVE FATTE.
//AD ES. L'alunno con id 1 ha avuto il voto su: ifenici(7), iromani(5), gli_egizi(null), ibabilonesi(6),
//MEDIA = (7+5+NULL+6)/4
echo "<table id='customers'>\n<tr>";
for ($i=0; $i < $numFields; $i++)
{
echo '<th>'.$fieldName = mysqli_fetch_field_direct($result, $i)->name.'</th>';
}
echo "</tr>\n";

while($row = mysqli_fetch_row($result))
{
echo '<tr><td>'.implode($row,'</td><td>')."</td></tr>\n";
}
echo "</table>\n";


mysqli_free_result($result);
mysqli_close($conn);
?>
</fieldset>
</div>
<input type="button" value="Stampa Tabella" id="btnPrint" />
</body>
</html>
 
Ciao, mi rendo conto che magari non vuoi cambiare perche ormai il database lo hai fatto, però la tabella così è strutturata male, cioè il fatto di dover aggiungere una colonna ad ogni verifica, oltre ad essere una "perdita di tempo", è anche molto difficile da gestire con SQL come vedi...
Se ti è possibile cambiare, io sceglierei una struttura di questo tipo, che con solo 2 tabelle racchiude tutte le materie ed è semplice da gestire con SQL:

Tabella1: 'verifiche', campi:
-id_verifica, materia, titolo

Tabella2: 'valutazioni', campi:
-id_verifica, alunno, voto

Dovrebbe funzionare così: nella tabella verifiche inserisci le varie verifiche e a ciascuna assegni la materia (storia), titolo (verifica fenici 08-12-20) e un id univoco, in modo che poi nella tabella delle valutazioni puoi inserire il voto di un determinati alunni nella verifica con quel determinato id. In questo modo tutto il discorso degli inserimenti e delle medie sarebbe molto più semplice e, se ti è possibile farlo, te lo consiglio vivamente perché ora come ora sembra davvero difficile da gestire
 
  • Like
Reactions: carlo.c
Stato
Chiusa ad ulteriori risposte.

Discussioni simili