Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47

    Mysql, campo che dipende dal valore di altri campi

    Ciao a tutti, avrei bisogno del vostro aiuto perchè navigo nel nulla e non ho molto tempo.
    Sto facendo un market per android (quindi java), ho un db mysql e nel mezzo php.

    Il mio problema è questo, nel DB ho una tabella APPLICAZIONI, una tabelle UTENTI e una tabella FEEDBACK (più altre tabelle che ora non ci interessano)

    Ogni utente che scarica una applicazione dal market può lasciare un voto, ovvero dare all'app da 1 a 5 stelline. Nella tabella FEEDBACK sic rea quindi un record della serie:
    APP_ID = 1, UTENTE_ID = 4, VOTO =4

    Quindi dopo che tanti utenti hans caricato e votato l'app avrò:
    APP_ID = 1, UTENTE_ID = 4, VOTO =4
    APP_ID = 1, UTENTE_ID = 1, VOTO =4
    APP_ID = 1, UTENTE_ID = 3, VOTO =1
    APP_ID = 1, UTENTE_ID = 2, VOTO =3

    Il mio problema è questo: nella tabella APPLICAZIONI ogni applicazione ha un campo VOTO_MEDIO. Quando uno sviluppatore inserisce una nuova app questio campo di default assume valore 0. Ma poi man mano che la gente scarica e vota questo campo dovrebbe avere come valore la media dei voti:

    x esempio coi dati sopra dovremmo trovare tutti i feedback con APP_ID =1 sommare i valori dei campi voto (4+4+1+3 = 12) e dividere la somma x il numero di righe (4 in questo caso) e quindi il voto medio sarebbe 3.
    Volendo potri calcolarlo al volo ogni volta che richiedo un app, senza enanche avere un campo VOTO_MEDIO, potrei fare una query al db in una pagina php che mi calcola il voto medio, quindi cercare nella tabella feedback quanti reghe ci sn per una certa app sommare i valori dei campi voto e dividere il tutto x il numero di righe, ma sarebbe un lavoro assurdo, perchè il voto medio compare in ogni dove e ogni mezzo secondo avrei decine di interrogazioni complesse x ricalcolare tale valore, i voglio invece avere un campo col valore già dentro e subito utilizzabile.

    A me non interessa che il valore del campo VOTO_MEDIO sia aggiornato in tempo reale ogni volta che un nuovo utente aggiunge un feedback (mi sembra esagerato e pesante), vorrei che una volta al giorno il db aggiornasse il valore del campo VOTO_MEDIO di tutte le applicazioni, così lavora sl una volta di notte e di giorno il valore è li pronto. che o facesse mysql non php con delle query...

    Il problema è che non ho la minima ide di come farlo in particolare.
    Come dico a mysql il valore di questo campo deve essere la media dei valori risultanti da........avete capito....

    E come gli dico di aggiornarli una volta al giorno?

    Qualcuno mi ha parlato di procedure o meglio di funzioni che si salvan in mysql e poi le uso nella mia tabella, della serie vado cn phpmyadmin e nella tabella APPLICAZIONI dico che il valore del campo VOTO_MEDIO sia calcolato dalla funzione da me creata MY_FUNC.....e cn uno scheduler farglielo fare una volta al di......ma di ste cose non so niente, non so se sia la strada giusta e qualche esemoio mi sarebbe comodo.

    Grazie mille e scusate se mi sono dilungato, era per far capire bene cosa devo fare.
    CIao

    Ultima modifica circa 3 ore fa di sgotenks

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    1) puoi fare un trigger che calcola "al volo" la media e che quindi l'aggiorna "magicamente"

    2) puoi farlo lato applicazione: quando inserisci un voto ricalcoli la media e l'aggiorni

    3) puoi farlo con la schedulazione di mysql (se hai almeno la versione 5.1) CREATE EVENT

    4) perfino con una schedulazione PHP

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    Originariamente inviato da franzauker
    1) puoi fare un trigger che calcola "al volo" la media e che quindi l'aggiorna "magicamente"

    2) puoi farlo lato applicazione: quando inserisci un voto ricalcoli la media e l'aggiorni

    3) puoi farlo con la schedulazione di mysql (se hai almeno la versione 5.1) CREATE EVENT

    4) perfino con una schedulazione PHP
    Escluderei soluzioni lato client............in pratica nn sarà il mio caso, ma immagina che ci sian migliaia di persone che scarican roba, sarebbe un macello di lavoro.......come se all'ipercoopo ci fosse qualcuno che ogni volta che un cliente compra una manetina aggiorna l'incasso......lo fa una volta a fine giornata e basta

    Io vorrei escludere il lavoro lato client o anche lato php.......non vorrei che quando uno da un voto parta uno script php che si fa ritornare il valore attuale del campo, aggiunge l'ennesimo voto e ricalcola la media...........vorrei tutto lato mysql........

    x quanto riguarda la 1, la 2 e la 3.........pur nn sapendo niente ne di trigger ne di create event (cmq confermo che la versione è dopo la 5.1)........mi sembran soluzioni a come dirgli aggiornana un campo sl in un determinato momento o quando succede qualcosa.............ma mi manca la risposta di base, ovvero come dire a mysql che il campo X dell taballe CAIO deve essere la media del risultato di una query fatta su una altra tabella (xchè alla fine è una query con una sum del campo X che viene divisa x il numero di righe)........nel senso io apro phpmyadmin vado nella struttura della tabella applicazione, gli dico che il campo VOTO_MEDIO è di tipo float.....ma come dirgli calcolalo così\cosaà?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    semplice, non glielo dici.

    ci vuole una

    UPDATE tabella set campo=qualcosa where blablabla

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    ok scusa la mia confusione ma mi sono perso..............ma quando uno mi dice se vuoi che l'emulatore android apra un menù devi scrivere quest'istruzione, allora io apro eclipse e scrivo codice java............se devo fare una query php, apro il mio ediotor, creo una pagina php e ci scrivo il mio codice...........qua invece non riesco a caspire dove mazza devo metterla quest'istruzione.

    Come ti dicevo io volevo fare tutto lato server sul db......supponiamo che questo blocco che chiamerò PAPPARDELLE

    Inizio blocco
    UPADATE bla bla bla
    SUMbla bla bla
    bla bla bla
    fine blocco

    sia la query sql che calcola il voto medio x una certa app interrogando la tabella feedback e facendo la media e che io voglia che a fine giornata il db esegua pappardelle x ogni app nel database.

    Quello che non capisco è fisicamente dove devo digitare PAPPARDELLE??????Apro Phpmyadmin e dove lo inserisco???Dove scrivo???

    e pappardelle è una semplice query sql o una funzione\procedura?

    tnx e scusa ma sn in panico

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Te l'ho scritto, ma lo riformulo.

    "da qualche parte" esisterà un programma che esegue qualcosa del genere
    [code]insert into feedback (...) voto=qualcosa[/b]
    bene, lì ci aggiungerai qualcosa tipo
    codice:
    update qualcosa set voto_medio=select(avg(qualcosa) from...) where ...
    In questo modo quando inserisci un valore automaticamente aggiorni la media, lato applicazione
    ---
    Puoi ottenere lo stesso risultato scrivendo un TRIGGER (che quindi non richiede modifiche all'applicazione), ad esempio
    AFTER INSERT (se vogliamo "copiare" la logica precedente)

    [code]
    DELIMITER |
    CREATE TRIGGER calcola_media AFTER insert ON nometabella
    FOR EACH ROW
    BEGIN
    UPDATE tabella SET MEDIA=qualcosa (...)
    END|
    DELIMITER

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Te l'ho scritto, ma lo riformulo.

    "da qualche parte" esisterà un programma che esegue qualcosa del genere
    codice:
    insert into feedback (...) voto=qualcosa
    bene, lì ci aggiungerai qualcosa tipo
    codice:
    update qualcosa set voto_medio=select(avg(qualcosa) from...) where ...
    In questo modo quando inserisci un valore automaticamente aggiorni la media, lato applicazione
    ---
    Puoi ottenere lo stesso risultato scrivendo un TRIGGER (che quindi non richiede modifiche all'applicazione), ad esempio
    AFTER INSERT (se vogliamo "copiare" la logica precedente)

    [code]
    DELIMITER |
    CREATE TRIGGER calcola_media AFTER insert ON nometabella
    FOR EACH ROW
    BEGIN
    UPDATE tabella SET MEDIA=qualcosa (...)
    END|
    DELIM

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Te l'ho scritto, ma lo riformulo.

    "da qualche parte" esisterà un programma che esegue qualcosa del genere
    insert into feedback (...) voto=qualcosa[/code]

    bene, lì ci aggiungerai qualcosa tipo

    update qualcosa set voto_medio=select(avg(qualcosa) from...) where ...

    In questo modo quando inserisci un valore automaticamente aggiorni la media, lato applicazione
    ---
    Puoi ottenere lo stesso risultato scrivendo un TRIGGER (che quindi non richiede modifiche all'applicazione), ad esempio
    AFTER INSERT (se vogliamo "copiare" la logica precedente)

    DELIMITER |
    CREATE TRIGGER calcola_media AFTER insert ON nometabella
    FOR EACH ROW
    BEGIN
    UPDATE tabella SET MEDIA=qualcosa (...)
    END|
    DELIMITER ;

    --- detto tra d

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Te l'ho scritto, ma lo riformulo.

    "da qualche parte" esisterà un programma che esegue qualcosa del genere
    insert into feedback (...) voto=qualcosa[/code]

    bene, lì ci aggiungerai qualcosa tipo

    update qualcosa set voto_medio=select(avg(qualcosa) from...) where ...

    In questo modo quando inserisci un valore automaticamente aggiorni la media, lato applicazione
    ---
    Puoi ottenere lo stesso risultato scrivendo un TRIGGER (che quindi non richiede modifiche all'applicazione), ad esempio
    AFTER INSERT (se vogliamo "copiare" la logica precedente)

    DELIMITER |
    CREATE TRIGGER calcola_media AFTER insert ON nometabella
    FOR EACH ROW
    BEGIN
    UPDATE tabella SET MEDIA=qualcosa (...)
    END|
    DELIMITER ;

    --- detto tra di noi, non sar

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    codice:
    Te l'ho scritto, ma lo riformulo.
    
    "da qualche parte" esisterà un programma che esegue qualcosa del genere
    insert into feedback (...) voto=qualcosa
    bene, lì ci aggiungerai qualcosa tipo

    update qualcosa set voto_medio=select(avg(qualcosa) from...) where ...

    In questo modo quando inserisci un valore automaticamente aggiorni la media, lato applicazione
    ---
    Puoi ottenere lo stesso risultato scrivendo un TRIGGER (che quindi non richiede modifiche all'applicazione), ad esempio
    AFTER INSERT (se vogliamo "copiare" la logica precedente)

    DELIMITER |
    CREATE TRIGGER calcola_media AFTER insert ON nometabella
    FOR EACH ROW
    BEGIN
    UPDATE tabella SET MEDIA=qualcosa (...)
    END|
    DELIMITER ;

    --- detto tra di noi,

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 © 2025 vBulletin Solutions, Inc. All rights reserved.