Chakra Linux Italia Forum

Supporto Tecnico Software => Consigli e discussioni generali sul Software => Topic aperto da: rodolforizzo76 - 15 Maggio 2013 ore 17:55

Titolo: Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 15 Maggio 2013 ore 17:55
Ciao a tutti, vorrei chiedere un consiglio, per sapere come si fa ad ottenere, tramite una query sql, la visualizzazione degli ultimi record visti da un utente. Mi spiego meglio: vorrei inserire un'opzione nel mio sito (quello che ho in firma), per fare in modo di visualizzare, per esempio, gli ultimi quadri visti dagli utenti del sito.
Qualcuno sa indicarmi il modo migliore per ottenere questo?

Grazie a tutti. 
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: elvis - 15 Maggio 2013 ore 18:02
Magari c'è un modo più efficiente, ma così al volo ti direi di implementare, con una apposita tabella del tuo DB, una associazione uno-a-molti tra gli utenti e i quadri.
Poi basta fare una semplice SELECT user FROM nuovaTabella e ci sei.

Questo se vuoi salvarti in modo persistente la cronologia di ciò che un utente vede. Se invece ti basta salvarti solo quello che l'utente ha visto nella sessione http attuale, puoi usare un mantenimento della sessione lavorando solo sul web server e non sul DB, ma qui dipende dal tipo di conoscenze che hai.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 15 Maggio 2013 ore 18:48
Ma la data di accesso ce l'hai?

In tal caso dipende dal DB.
Se non ricordo male in oracle si usava una
SELECT TOP N FROM TABLE_XXX WHERE .... ORDER BY DATA_ACCESSO DESC

Se non è diponibile la top potresti leggerti da programma (si chiamano ancora cursori?) i primi N record che fornisce la query precedente (senza TOP, ovviamente)

Spero di aver capito la domanda...
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 15 Maggio 2013 ore 21:55
elvis@

Anche io credo che dovrei creare una nuova tabella per gestire questo tipo di risultato, solo che ho le idee un po confuse. Non ho capito cosa intendi per "una associazione uno-a-molti tra gli utenti e i quadri. "... non è che potresti spiegarmelo come lo spiegheresti a "tua nonna"? Credo che se riesco ad afferrare bene il concetto poi dovrei riuscire a implementarlo.

dinolib@

Purtroppo la data di accesso non ce l'ho.. ho solo la data di quando è stato inserito il quadro, che non credo possa servire allo scopo.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: elvis - 15 Maggio 2013 ore 23:54
elvis@

Anche io credo che dovrei creare una nuova tabella per gestire questo tipo di risultato, solo che ho le idee un po confuse. Non ho capito cosa intendi per "una associazione uno-a-molti tra gli utenti e i quadri. "... non è che potresti spiegarmelo come lo spiegheresti a "tua nonna"? Credo che se riesco ad afferrare bene il concetto poi dovrei riuscire a implementarlo.
Per associazione uno-a-molti si intende che ogni utente è associato ad uno o più quadri. Tecnicamente, in questa nuova tabella hai una riga per ogni utente, ed ogni riga ti dice quali quadri ha visto questo utente. Ripensandoci però ti serve un'associazione molti-a-molti, perchè se è vero che devi associare un utente a più quadri, dovresti anche permettere ad un quadro di essere associato a più utenti (con la uno-a-molti non puoi farlo).

Questa è l'idea "a parole", poi per implementarla devi conoscere il concetto di primary key, foreign key, e relativa sintassi SQL. Con un pò di pazienza e qualche ricerca in rete, dovresti trovare tonnellate di materiale sull'argomento.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 00:12
ok, ci lavoro su, tengo aperto il topic nel caso avessi qualche domanda e grazie per i consigli. Non appena risolvo (se risolvo) metto "topic risolto".

Ciao e grazie ancora.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: jmc - 16 Maggio 2013 ore 00:30
La domanda non è formulata benissimo: la query dipende dallo schema del database, quindi non ti si può rispondere con esattezza. Se invece cerchi consigli su come impostare lo schema (e di conseguenza le query), allora si può fare, ma ti inviterei ad esporre più precisamente qual è lo stato attuale delle cose e i tuoi requisiti. :)
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 00:37
Una domanda: se ogni volta che qualcuno visualizza un quadro nel sito una query insert va a popolare la tabella appositamente creata nel database, come posso evitare di avere una moltitudine di record? a me interessa sapere gli ultimi 30/40 quadri visti.

pensare di cancellare i record in eccesso con un'altra query mi sembra una soluzione possibile ma ho un dubbio... i nuovi record dovrebbero, al momento dell'inserimento, essere messi al primo posto e non in coda. Giusto?

É possibile?
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 00:54
jmc@

Queasta è la tabella images:

Codice: [Seleziona]
Field Type Null Key Default Extra
image_id int(11) NO PRI NULL auto_increment
image_caption varchar(255) NO NULL
image_username varchar(255) NO NULL
image_date date NO NULL
image_genere varchar(255) NO NULL
image_link varchar(255) NO NULL
image_thumb_link varchar(255) NO NULL
image_description varchar(255) YES NULL
image_width varchar(255) YES NULL
image_height varchar(255) YES NULL


ma penso che dovrò creare una tabella apposta per poter visualizzare gli ultimi quadri visti.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 01:15
...e poi un'altra domanda:
come si fa a fare in modo che ogni volta che qualcuno clicca su un link per visualizzare un quadro, venga eseguita una query che popola la tabella del db? si può fare?
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 16 Maggio 2013 ore 07:44
Certo dovrai crearti una tabella images_access dove indicare id_image, id_utente, data_accesso (tutti e tre chiave primaria).
Dovrai poi collegare la visita ad una immagine alla chiamata di aggiornamento del DB.

Hai due modi per la gestione:
1- la insert semplicemente scrive una riga. La select sceglie gli ultimi visti dall'utente (come visto nella select precedente). Ogni tanto lanci una query di pulizia che elimina, chessò, gli accessi più vecchi di un mese o per ogni utente ne limita il numero a 50.
In tal modo le insert saranno veloci.

2-durante la insert vai anche a cancellare per l'utente che ti interessa le vecchie visite secondo i parametri che ti sei imposto (vecchiaia e numero). La select lavora sempre con la TOP (puoi anche evitarlo, ma così hai più flessibilità). Non ti servirà più lanciare la query di pulizia.
Questo sistema è di facile gestione anche se potrebbe richiedere un po' di tempo l'insert (in realtà con gli indici dovrebbe essere molto rapida). Non credo tu abbia migliaia di accessi al minuto, vero?

La pulizia potrebbe essere tipo:

DELETE FROM images_access WHERE id_utente=utente AND data_accesso < data
(ora devo andare al lavoro. aggiungerò il pezzo con una NOT IN per lasciare un numero minimo di record per utente)

Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 10:21
dinolib@

Citazione
Dovrai poi collegare la visita ad una immagine alla chiamata di aggiornamento del DB.

non so cosa sia una vista e un immagine alla chiamata di aggiornamento. (per la vista penso di riuscire a documentarmi), l'immagine alla chiamata di aggiornamento non l'ho mai sentita.

pensavo fosse più facile da fare, ma la vedo dura.. 

Citazione
1- la insert semplicemente scrive una riga. La select sceglie gli ultimi visti dall'utente (come visto nella select precedente). Ogni tanto lanci una query di pulizia che elimina, chessò, gli accessi più vecchi di un mese o per ogni utente ne limita il numero a 50.
In tal modo le insert saranno veloci.

non capisco come e quando dovrebbe avvenire la insert, se voglio fare eseguire una query la metto nel codice nel punto dove voglio che venga eseguita, ma come faccio a fare eseguire una query ogni volta che uno visualizza un quadro?

si, mi sa che voglio fare il passo più lungo della gamba. Credo che devo studiare un po di roba.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 16 Maggio 2013 ore 11:14
Calma e gesso  ;D
Premessa: non so che tecnologia hai utilizzato sul tuo sito. Chiedendo info su una query pensavo fossi abbastanza esperto di scripting lato server! Ho dato per scontato molte cose.

Come dice jmc prima dovresti darci un minimo di indicazioni sulla architettura del tuo sito (linguaggio server (perl,php,asp,.net,java,cgi,altro?) e client (penso sia js), DB server). Poi dovremmo capire come funziona il tuo hosting. Hai accesso completo al server?

La parte di collegare la visita ecc. è solo una breve analisi di cosa fare ad alto livello. Intendo: quando un utente visita una pagina (immagino sia una pagina dinamica, giusto?) questa va ad attivare lato server una serie di operazioni per estrarre il quadro dal DB, ecc. Qui vanno inserite le operazioni di insert e delete per aggiornare la tabella delle visite.
Se ho tempo visito il tuo sito, da lì qualcosa si capisce
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 16 Maggio 2013 ore 11:17
OK, già si vede che hai php lato server (jmc! il tuo amore  ;)).
La pagina visual1.php che fa? Lì dentro si andrà a leggere i quadri che uno visita. Io partirei da lì a studiare il codice e capire che si può fare.

PS: ma il sito l'hai realizzato tu da zero o hai usato un qualche strumento di content management?

PPS: purtroppo io posso aiutarti solo su SQL, è da 10 anni che non lavoro e mi aggiorno su server scripting :-(
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 11:37
si, il sito l'ho realizzato da zero senza l'uso di alcun cms, mi sono avvalso di uno script già pronto per la gestione dei login (dev.login) che ho trovato in rete e per le query un po più complesse sono stato aiutato da Salvatore (alias re-verse) - Moderatore del forum di MySQL-Italia (che forse non è più attivo), il quale ha contribuito scrivendo molte delle query sql che interrogano il database.

Il file visual1.php in pratica esegue questa query:

Codice: [Seleziona]
$sql = "SELECT * FROM images, dl_user WHERE images.image_genere = '$genere' AND dl_user.username = images.image_username GROUP BY image_username ORDER BY RAND() ASC LIMIT " . $inizio . ", " . $fine;

e poi un ciclo for dispone nella pagina tutti i pittori disponibili per il genere selezionato. Ma per vedere i quadri si deve cliccare su un pittore che ti porterà alla pagina visual_ctg.php dove sarà possibile visualizzare i quadri appartenenti al pittore selezionato in visual1.php

Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 11:43
quello che non capisco è come si fa a fare eseguire una query per inserire un record nella tabella nel momento in cui uno clicca su un quadro per visualizzarlo. L'unica cosa che mi viene in mente è usare javascript (qualcosa tipo onclick)
Ma la cosa mi sembra un po macchinosa e forse potrebbe avere delle controindicazioni?

Si.. la vedo dura.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: elvis - 16 Maggio 2013 ore 12:29
quello che non capisco è come si fa a fare eseguire una query per inserire un record nella tabella nel momento in cui uno clicca su un quadro per visualizzarlo. L'unica cosa che mi viene in mente è usare javascript (qualcosa tipo onclick)
Ma la cosa mi sembra un po macchinosa e forse potrebbe avere delle controindicazioni?

Si.. la vedo dura.
Nel momento in cui un utente clicca su un quadro, invia una richiesta http al server per quel quadro. Devi quindi usare un "handler" che da questa richiesta estrae il nome del quadro e lo registra nel DB, associandolo al giusto utente. Devi andare di php, in pratica. Purtroppo come linguaggio non lo conosco, ma in rete dovresti trovare tutto ciò che ti serve.
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 16 Maggio 2013 ore 12:30
Penso che la cosa migliore sia di modificare la pagina http://www.painteronline.org/visual_ctg.php.
Invece che dare il link al jpg, dovrebbe rimandare ad un altro php che ritorna la jpg ma fa anche le operazioni che ti servono sul DB (purtroppo non so come si implementa, ma di sicuro si fa  ;D).

L'alternativa col JS è fattibile ma non mi piace molto. La vedo poco robusta...
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: dinolib - 16 Maggio 2013 ore 12:31
elvis ti ha proposto praticamente la stessa cosa  ;D (poi tecnicamente ci sono n modi per farlo!)
Titolo: Re:Consiglio su query sql per visualizzare ultimi record visti
Inserito da: rodolforizzo76 - 16 Maggio 2013 ore 14:03
Grazie per le risposte, forse adesso ho le idee piu chiare sul "come si fa". Effettivamente credo che questa:

Penso che la cosa migliore sia di modificare la pagina http://www.painteronline.org/visual_ctg.php.
Invece che dare il link al jpg, dovrebbe rimandare ad un altro php che ritorna la jpg ma fa anche le operazioni che ti servono sul DB (purtroppo non so come si implementa, ma di sicuro si fa  ;D).

L'alternativa col JS è fattibile ma non mi piace molto. La vedo poco robusta...

sia la strada giusta. Non so se riuscirò a implementare il tutto ma grazie ai vostri consigli adesso ho un idea di come procedere.

Grazie.