Visualizzazione risultati 1 fino 10 di 10

Discussione: Struttura DB per assegnazione punti (era "mi suggerite un modus operandi?")

  1. #1
    Guest

    Predefinito Struttura DB per assegnazione punti (era "mi suggerite un modus operandi?")

    ciao ragazzi, sono proprio confuso.
    non so come procedere.
    spiego il mio script.
    c'è una lista di utenti con una graduatoria.
    l'amministratore crea due gruppi separati.
    TEAM A e TEAM B ognuno dei quali ha 5 utenti.

    alla fine del lavoro uno dei due team prende un punto e l'altro no. quando il team prende il punto gli utenti di QUEL team salgono in gradutaoria prendendo un punto, l'altro team no.
    visto che i team sono molteplici e visto che vorrei tenere anche un report dei vecchi TEAM come posso fare?

    grazie.
    avevo iniziato con una cosa semplice, pensando che fosse adatta, e cioè un campo text in cui inserivo la lista degli utenti di ogni team.
    ma non riesco poi a tornare indietro ai singoli componenti per dar loro il punto, quando è necessario.
    devo incrociare un pò di tabelle, ma non trovo la logica :(

    mi aiutate con qualche indea, se potete, per favore?

    grazie.

    EDIT: scusate x il titolo, ma mi sapreste, infine, suggerire un algoritmo per questa cosa?
    è difficile, impossibile o troppo stupido e x questo nn rispondete? :D


    FunCool: Non fare UP, usa il tasto Edita.
    Ultima modifica di funcool : 19-04-2006 alle ore 18.48.43

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Se ho capito bene quello che intendi fare, prova una struttura del genere per il database...

    LAVORI (IdLavoro, Nome, Descrizione, Valore[, TeamVincitore])
    Caratterizza un lavoro con un nome, una descrizione del compito, un valore/punteggio e l'eventuale team vincitore (se ne è previsto sempre uno solo, il campo sarà impostato a NULL finché non sarà determinato)

    TEAM (IdTeam, NomeTeam)
    Caratterizza un team con il proprio nome

    COMPONENTI (IdComponente, NomeComponente, TeamAppartenenza)
    Caratterizza i componenti, specificandone il nome e il team di appartenenza (beh, questa tabella è puro optional...)

    ISCRIZIONI (Lavoro, TeamIscritto)
    Conserva i dati delle iscrizioni dei vari team ai singoli lavori, tenendo conto che un team può iscriversi a più lavori e che viceversa un lavoro ha ovviamente in competizione più team

    PREMI (IdLavoro, TeamVincitore)
    Aggiungi questa tabella SOLO se per ogni lavoro è previsto più di un vincitore, oppure se proprio non sopporti i valori NULL che in qualche caso dovrai avere (vedi sopra).

    Ecco quindi la query con cui puoi compilare la classifica (ho i miei dubbi che, però, funzioni qui su AV...):

    SELECT NomeTeam, SUM (Valore) AS Totale
    FROM TEAM, LAVORI
    WHERE IdTeam = TeamVincitore
    GROUP BY IdTeam, NomeTeam

    UNION SELECT NomeTeam, 0
    FROM TEAM
    WHERE IdTeam NOT IN (SELECT TeamVincitore FROM LAVORI)

    ORDER BY Totale

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    intanto ti ringrazio per il suggeriemnto così esaustivo,
    solo che temo di non averlo compreso fino in fondo :(

    il fatto è questo: c'è una lista di utenti.
    l'amministratore ne raggruppa 5 in un team, e 5 in un altro.
    questi si "scontrano", il teamc he vince, fa assegnare un punto per ogni membro.
    concluso lo scontro, tali team spariscono, e dovrebbero finire in un report in cui possono essere letti.

    secondo scontro.
    l'amministrare forma ancora due nuovi team,
    si scontrano, chi vince ottiene un punto.
    memorizzati, e team resettati...

    e così via...
    spero di essermi spiegato ora...
    mi sai aiutare?

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Ma a me non e' chiaro cosa vorresti sapere: la struttura migliore per il tuo DB, oppure ce l'hai gia' e vuoi un modo per gestirlo via PHP (o altro linguaggio di scripting nei limiti delle mie conoscenze)?

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    grazie per l'interessamento, intanto!
    ti rispondo: mi voglio appoggiare a MySQL e PHP, per cui la cosa che vorrei spere è, in relazione alle mie necessità, il modo migliore per costruire, linkare, aggiornare le tabelle :D

    lista utenti -> due sole squadre in cui suddividerli -> scontro tra i team -> team vincente fa guadagnare un punto ai membri -> "scontro" chiuso partita inserita in un report visualizzabile nel tempo.
    devo tener traccia anche della data e del risultato con cui un team vince sull'altro.

    spero di aver chiarito le mie necessità :D

    graie ancora!
    mi piacerebbe capire come creereste le tabelle e come lavorereste su di esse.

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Allora, intanto ti scrivo uno schema per il DB che è in grado di memorizzare quanto detto da te:

    LAVORI (IdLavoro, NomeLavoro, DescrizioneLavoro, DataAssegnazioneLavoro, PunteggioLavoro, TeamVincitore)
    TEAM (IdTeam, LavoroAssegnato, NomeTeam)
    COMPONENTI (IdComponente, NomeComponente, PunteggioRidondato)
    COMPOSIZIONI (TeamInserimento, ComponenteDelTeam)

    All'inizio dovrai creare tutti i COMPONENTI che partecipano nelle varie squadre (ci dovranno essere sempre, anche se magari qualche volta non partecipano). L'eventuale punteggio iniziale (se deciderai di specificarlo, vedi sotto perché), ovviamente sarà 0.

    La creazione di un lavoro funziona così:
    - crei un record su LAVORI, inserendo tutti i dati necessari (ovviamente TeamVincitore sarà nullo perché ancora sconosciuto :-D)
    - crei due nuovi TEAM, ad entrambi assegni lo stesso LAVORO
    - crei tanti record su COMPOSIZIONI, specificando su ognuno un ID di COMPONENTI e l'ID di TEAM nel quale vuoi inserirlo

    Quando vorrai chiudere il lavoro, procedi così:
    - modifica il record di LAVORI relativo, inserendo nel campo TeamVincitore l'ID del TEAM che l'ha vinto
    - se hai deciso di specificare il punteggio nei singoli COMPONENTI, dovrai preoccuparti di incrementare tutti i singoli valori ad essi associati.

    Una piccola nota riguardo il campo PunteggioRidondato: inserendolo crei quella che si chiama ridondanza in una base di dati. Le ridondanze sono piuttosto "pericolose", in quanto duplicazioni di dati perfettamente ricavabili in altro modo (in questo caso, unendo le tabelle LAVORI, TEAM e COMPONENTI e sommando a gruppi di IdComponente i campi PunteggioLavoro). Decidi tu quello che ti conviene:
    - eliminare tutte le ridondanze ma dannarti a fare un'unione di tre tabelle quando vorrai sapere il punteggio che ha acquisito finora un COMPONENTE? (scelta preferita dai "puristi" di basi di dati)?
    - mantenere la ridondanza, in modo da conoscere in un attimo il punteggio di un COMPONENTE (basta estrarne il valore), ma dannandoti a fare il doppio degli aggiornamenti (scelta presa comunque in considerazione dagli "ingegneristi")?

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  7. #7
    Guest

    Predefinito

    allora, intanto ti ringrazio molto per il tempo dedicatomi.
    sfortunatamente, non avendo ricevuto piu risposte per qualche tempo, avevo portato avanti il laovoro da solo e non ho pensato ad avvertire qui in questo topic, mi dispiace molto.
    avevo infatti aperto un nuovo topic in cui raffinavo delle query di select, poichè avevo creato le tabelle praticamente come me le avevi suggerite tu qui, con la stessa filosofia e devo ottimizzare le selezioni.
    temo infatti di fare un numero spropositato di query non conoscendo un modo più compatto per comunicare col database.
    ora non so come procedere.
    se direttamente qui, affrontando un passo alla volta o spostando la discussione nell'altro.
    pensavo di postare un'immagine con lo schema del mio databse, per poter lavorare in modo efficiente e poterci capire con facilità.
    ad ogni modo, non posso non ringraziarti di cuore e mandarti un sentito abbraccio per la disponibilità al lmite dell'imbarazzante che mi hai gentilmente donato!
    GRAZIE!

  8. #8
    Guest

    Predefinito

    ho creato un'immagine che rappresenta il mio database:

    http://lsdfreetime.altervista.org/db2.jpg

    l'amministratore accede alla lista di giocatori. ognuno dei quali ha una casella di spunta con cui può essere selezionato.
    l'aaministratore, seleziona i primi 5 ed invia il modulo, nella pagina ricaricata prima viene creata la squadra 1, poi vengono visualizzati SOLO gli utenti non ancora selezionati (sel=0).
    seleziona e reinvia il modulo.
    viene creata anche la seconda squadra.
    le squadre sono create, viene creata la partita con la data, ed è impostata a PENDENTE (=0), perchè ancora deve essere giocata (manca infatti il risultato).

    lo script per fare tutto ciò è:
    Codice PHP:
    <?php
    include('script/check_login.php');
    include(
    'script/header.php');
    include(
    'script/conn.php');

    $i = 0;
    if(
    $_POST['giorno'] == '0' || $_POST['mese'] == '0' || $_POST['anno'] == '0000'){
    echo
    "<div id=corpo>";
    echo
    "Devi impostare la data della partita!<br>:: <a href=javascript:history.back()>Indietro</a>";
    echo
    "</div>";
    exit;
    }

    $data = $_POST['giorno']."/".$_POST['mese']."/".$_POST['anno'];

    //********************
    //CREAZIONE SQUADRA A
    //********************
    if(isset($_POST['submit']) and $_POST['submit'] == 'Crea Squadra'){
    if (isset(
    $_POST['check'])){
    $listaid = "";
    foreach (
    $_POST['check'] as $key => $val){
    if(
    $listaid == ''){
    $listaid = $val;
    }
    else{
    $listaid = $listaid.", ".$val;
    }
    }
    }
    if(
    $listaid == ""){
    echo
    "<div id=corpo>";
    echo
    "Non hai selezionato alcun membro per la squadra!<br>:: <a href=javascript:history.back()>Indietro</a>";
    exit;
    }
    echo
    "<div id=corpo><table><tr><td>
    <h1 align=center>:: Squadra creata :: </h1>
    <table border=1 align=center cellpadding=5 cellspacing=1>
    <tr>
    <td>Nome</td><td>Cognome</td><td>Punti</td><td>@mail</td>
    </tr>"
    ;



    //CREA UNA NUOVA SQUADRA E PRELEVA L'ID DEL TEAM CREATO
    //CREA NOME TEAM
    $num = mysql_query("SELECT COUNT('id_team') FROM team") or die(mysql_error());
    list(
    $count) = mysql_fetch_array ($num);
    if(
    $count == 0){
    $rel = 1;
    }
    else{
    $rel = $count+1;
    }

    $sq = "sq".$rel;

    $team_ins = "INSERT INTO team (id_team, nome_sq) VALUES ('', '$sq')";
    mysql_query($team_ins) or die(mysql_error());
    $id_team = mysql_insert_id();

    //SELEZIONE GIOCATORI
    $giocatori = mysql_query ("SELECT * FROM giocatori where id_giocatore in (".$listaid.") ORDER BY punti DESC;") or die(mysql_error());

    //VISUALIZZA I GIOCATORI IN UNA TABELLA E AGGIORNA LE INFO DI OGNI GIOCATORE SELEZIONATO
    //CON L'ID DEL TEAM
    while ($row_giocatori = mysql_fetch_array($giocatori)){
    echo
    "<tr>";
    echo
    "<td>".$row_giocatori['nome']."</td><td>".$row_giocatori['cognome']."</td><td>".$row_giocatori['punti']."</td><td>".$row_giocatori['email']."</td>";
    echo
    "</tr>";
    $id_giocatore = $row_giocatori['id_giocatore'];

    mysql_query ("UPDATE giocatori SET sel='1', id_squadra='$id_team' WHERE id_giocatore='".$id_giocatore."' LIMIT 1") or die(mysql_error());

    }

    //FORMATTAZIONE TABELLA
    echo"</table>";
    echo
    "</tr></td><td></td><td>";

    echo
    "<br><br><h1 align=center>:: Seconda squadra ::</h1>
    <table border=1 align=center cellpadding=5 cellspacing=1>
    <tr>
    <td>Nome</td><td>Cognome</td><td>Punti</td><td>Seleziona</td>
    </tr>
    <form method=post id=sqb action=squadra.php?id_canc=
    $id_team&sqA=$id_team&data=$data>";

    //SELEZIONA I GIOCATORI NON ANCORA SELEZIONATI
    $sq2 = mysql_query("SELECT * FROM giocatori WHERE sel='0' ORDER BY punti DESC;");

    //CREA FORM CON I GIOCATORI NON ACNORA SELEZIONATI
    while($row_sq2 = mysql_fetch_array($sq2)){
    $valore = $row_sq2['id_giocatore'];
    echo
    "<tr>";
    echo
    "<td>".$row_sq2['nome']."</td><td>".$row_sq2['cognome']."</td><td>".$row_sq2['punti']."</td><td align=center><input type=\"checkbox\" name='check[]' value='$valore'></td>";
    echo
    "</tr>";
    }
    echo
    "</table><input type=submit name=submit2 value='Crea Squadra'></form></td></table>";

    }
    //chiude primo ISSET

    //*******************
    //CREAZIONE SQUADRA B
    //*******************
    $listaid ='';
    if(isset(
    $_POST['submit2']) and $_POST['submit2'] == 'Crea Squadra'){
    if (isset(
    $_POST['check'])){
    $listaid = "";
    foreach (
    $_POST['check'] as $key => $val){
    if(
    $listaid == ''){
    $listaid = $val;
    }
    else{
    $listaid = $listaid.", ".$val;
    }
    }
    }

    //ERRORE DI SELEZIONE
    if($listaid == ""){
    echo
    "<div id=corpo>";
    echo
    "Non hai selezionato alcun membro per la squadra!<br>";
    $id_can = $_GET['id_canc'];
    echo
    "$id_canc";
    mysql_query("DELETE FROM team WHERE id_team='$id_can'") or die(mysql_error());
    echo
    "<b>Per evitare errori nell'inserimento dei dati, tornare alla <a href=squadre.php>pagina inizale</a>.</b>";
    exit;
    }
    //SELEZIONA GIOCATORI SELEZIONATI
    $team2 = mysql_query ("SELECT * FROM giocatori where id_giocatore in (".$listaid.") ORDER BY punti DESC") or die(mysql_error());

    //CREA UNA NUOVA SQUADRA E PRELEVA L'ID DEL TEAM CREATO
    //CREA NOME SUQDRA
    $num2 = mysql_query("SELECT COUNT(id_team) FROM team");
    list(
    $count2) = mysql_fetch_array ($num2);

    if(
    $count2 == 0){
    $rel = 1;
    }
    else{
    $rel = $count2+1;
    }

    $sq = "sq".$rel;

    $team2_ins = "INSERT INTO team (id_team, nome_sq) VALUES ('', '$sq')";
    mysql_query($team2_ins) or die(mysql_error());
    $id_team2 = mysql_insert_id();
    $sq = "sq".$id_team2;

    //AGGIORNA LE INFO NELLA TABELLA TEAM
    while ($row_team2 = mysql_fetch_array($team2)){
    $id_giocatore = $row_team2['id_giocatore'];
    mysql_query ("UPDATE giocatori SET sel='1', id_squadra='$id_team2' WHERE id_giocatore='".$id_giocatore."' LIMIT 1") or die(mysql_error());
    }


    //CREA PARTITA E MEMORIZZA ID UNIVOCO
    $id_team = $_GET['sqA'];
    $data = $_GET['data'];
    $ry = "INSERT INTO partite (id_partita, id_teamA, id_teamB, data, risultato, pendente)
    VALUES ('', '
    $id_team', '$id_team2', '$data','','0')";
    mysql_query($ry) or die(mysql_error());
    $id_partita = mysql_insert_id();

    //CREAZIONE REPORT
    $arr = 0;
    $sel = mysql_query("SELECT * FROM giocatori WHERE id_squadra='$id_team' OR id_squadra='$id_team2' ") or die(mysql_error());
    while(
    $row = mysql_fetch_array($sel)){
    $id = $row['id_giocatore'];
    $team = $row['id_squadra'];
    $nome = $row['nome']." ".$row['cognome'];
    if(
    $arr == 0){
    $arr = $team;
    $sqA = $sqA." ".$nome."<br>";
    }
    else if(
    $arr == $team){
    $sqA = $sqA." ".$nome."<br>";
    }
    else if(
    $arr != $team){
    $sqB = $sqB." ".$nome."<br>";
    }

    $ins = "INSERT INTO report (id_partita, id_giocatore, id_team) VALUES
    ('
    $id_partita', '$id', '$team')";
    mysql_query($ins) or die(mysql_error());
    }

    echo
    "
    <div id=corpo>
    <h1 align=center>:: Riepilogo squadre :: </h1>
    <table align=center>
    <tr><td align=center><b>Squadra I</b></td><td>&nbsp;&nbsp;</td><td align=center><b>Squadra II</b></td></tr>
    <tr><td>
    $sqA</td><td></td><td>$sqB</td></tr>
    </table>
    "
    ;


    }
    //chiude il controllo isset del form della squadra 2

    echo"</div>";

    ?>
    a seguito, viene visualizzato il report delle due squadre.
    si può fare meglio?


    FunCool: Ho messo il link all'immagine per non deformare tutto il forum.
    Ultima modifica di funcool : 24-04-2006 alle ore 18.30.55

  9. #9
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Non riesco a capire molto bene lo schema... hai fatto un "fritto misto" tra uno schema relazionale e un diagramma di flusso mica tanto comprensibile...

    Tra le poche cose che credo di aver capito e che posso recriminarti:
    - perché specificare un campo "pendente" su partita quando, impostando a NULL "risultato", puoi benissimo stabilire quali partite sono in corso e quali no?
    - sempre in "partite", ricordati di inserire ANCHE in quella tabella un campo "id_partita", altrimenti non riuscirai a collegarle con i report...
    - non ha molto senso specificare "id_squadra" nella tabella "giocatori", visto che cambia ad ogni partita: com'è che fai dopo a scoprire in quali squadre ha giocato in passato (beh, adesso che guardo meglio, può considerarsi anche questa una ridondanza vista la presenza di "id_team" in "report": ma a che vantaggio?)

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  10. #10
    Guest

    Predefinito

    id_partita è presente, ma non lo avevo scritto: dimenticanza mia :D

    il recupero dei giocatori nelle squadre è fatto attraverso la tabella report:
    c'è l'id dell partita, l'id del giocaotre e l'id del tem cui appartiene...

    certo la cosa difficile è recuperare tutte le query he ho fatto: temo siano troppe e ridondanti, col rischio di allungare le richieste, quando invece potevo compattarle meglio, ma non so come fare.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •