• User

    SELECT complicato!

    Ciao a tutti,
    mi sto scervellando a cercare una soluzione per un mio problema ma non riesco a trovare l'input giusto:

    PROBLEMA: Ho un database nel quale sono salvati "utenti" ed i loro "contenuti" di immagini (path assoluto alle immagini).
    Ogni immagine ha oltre al path e l'id del suo proprietario anche il campo date per avere un ordine cronologico di inserimento.

    Ho la necessità di mostrare tramite php le ultime dieci immagini inserite, ma solo una per ogni utente in modo che se un utente invia ad esempio 20 immagini il box che mostra non sia pieno di immagini dalle foto di quel solo utente.

    Il mio problema è solo nella query da inviare al database.

    Qui sotto la query che usavo per mostrare le ultime 10 immagini senza tener conto dell'utente che l'ha inserita:

    [PHP]$query="SELECT * FROM media WHERE type='photo' ORDER BY date DESC LIMIT 10";[/PHP]

    Grazie dell'aiuto


  • User Attivo

    L'unica soluzione che ora mi viene in mente, è quella di prendere gli ultimi 10 utenti che hanno postato una foto
    [PHP]$query="SELECT distinct(id_utente) FROM media WHERE type='photo' ORDER BY date DESC LIMIT 10"; [/PHP]

    e poi prendere per ognuno di essi l'ultima foto postata, questo puoi farlo scorrendo il risultato della precedente query con un foreach e per ogni iterata esegui la seconda query.


  • User

    Ciao,
    se vuoi fare una select superfiga che estrae le ultime 10 immagini per utente ordinate per data, prova la seguente select:

    SELECT * FROM (
    SELECT S2.*,  FIND_IN_SET(S2.date , (
    SELECT GROUP_CONCAT(date ORDER BY date DESC)
    FROM (SELECT * FROM media WHERE type='photo') S1
    WHERE S1.id_utente = S2.id_utente)) AS RANK
    FROM (SELECT * FROM media WHERE type='photo') S2    
    ) a WHERE rank<=10
    

    è difficile da leggere, ma se riesci a capire come funziona, ti sarà di aiuto in tutti i casi dove avrai bisogno di un rank. E' simile al comando ORACLE RANK() OVER (PARTITION BY ID_UTENTE ORDER BY DATE)

    Ciao
    Mik


  • User

    @OsteriaORistorante said:

    Ciao,
    se vuoi fare una select superfiga che estrae le ultime 10 immagini per utente ordinate per data, prova la seguente select:

    SELECT * FROM (
    SELECT S2.*,  FIND_IN_SET(S2.date , (
    SELECT GROUP_CONCAT(date ORDER BY date DESC)
    FROM (SELECT * FROM media WHERE type='photo') S1
    WHERE S1.id_utente = S2.id_utente)) AS RANK
    FROM (SELECT * FROM media WHERE type='photo') S2    
    ) a WHERE rank<=10
    

    è difficile da leggere, ma se riesci a capire come funziona, ti sarà di aiuto in tutti i casi dove avrai bisogno di un rank. E' simile al comando ORACLE RANK() OVER (PARTITION BY ID_UTENTE ORDER BY DATE)

    Ciao
    Mik

    Grazie a tutti per i suggerimenti ... mi avete "acceso" la lampadina!
    SELECT annidati etc ... oppure distinct() ...
    appena ho un attimo mi metto all'opera e vi dico quale metodo mi ha velocizzato l'otteniimento del risultato.

    Grazie