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>
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>