Mysql, campo che dipende dal valore di altri campi | SQL & MySQL

Topic: Pubblico - Composto da 2 Posts di 2 Utenti.

26 Luglio, 2011 13:17 #1
sgotenks
Utente

sgotenks
Registrato: Apr, 2011
Posts: 7
Offline

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 26 Luglio, 2011 13:21 di sgotenks

10 Agosto, 2011 01:36 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

A meno che gli utenti non votino minimo una volta al secondo, usa pure un trigger sulle insert. Aggiornerai l'altra tabella in tempo reale, ed è piuttosto semplice:
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
Per calcolare la media, puoi usare la funzione AVG().

Per farlo una volta al giorno dovresti usare un evento (cerca CREATE EVENT) che chiama una stored procedure. Ma sinceramente credo che sia una complicazione inutile.

Condividi su:

Loggati o Registrati per replicare