Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768

    [mysql] seleziona e raggruppamento

    Innanzituto Buona Pasqua.

    se ho una tabella così composta

    id, categoria, autore, data

    e supponendo che i record siano questi:

    1,auto,marco,lunedì
    2,auto,marco,martedì
    3,moto,marco,martedì
    4,nave,pasquale,lunedì
    5,auto,pasquale,martedì


    come faccio a selezionare i 2 record più recenti che abbiano lo stesso valore per "categoria" (ad esempio: "auto") ma "autore" diverso?

    dovrei ottenere i record con id: 2 e 5
    Hai provato a creare un sito con Jaaxo Cms PHP5? new!

  2. #2

    Re: [mysql] seleziona e raggruppamento

    Originariamente inviato da gasmor
    Innanzituto Buona Pasqua.

    se ho una tabella così composta

    id, categoria, autore, data

    e supponendo che i record siano questi:

    1,auto,marco,lunedì
    2,auto,marco,martedì
    3,moto,marco,martedì
    4,nave,pasquale,lunedì
    5,auto,pasquale,martedì


    come faccio a selezionare i 2 record più recenti che abbiano lo stesso valore per "categoria" (ad esempio: "auto") ma "autore" diverso?

    dovrei ottenere i record con id: 2 e 5
    Da come mi sembra di aver capito devi creare un array con i giorni della settimana ordinati secondo il canone con cui i giorni della settimana nel formato di php rispecchino i giorni della settimana in lettere.

    E poi crei una query dove estrai quelli più recenti facendo corrispondere il giorno della settimana ovviamente. E fai un raggruppamento per categoria.

  3. #3
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    I giorni della settimana li ho scritti in quel modo per semplificare la lettura dei record. In realtà sono dei TIMESTAMP.

    Comunque vorrei riuscire a risolvere con una sola query.
    Hai provato a creare un sito con Jaaxo Cms PHP5? new!

  4. #4
    Originariamente inviato da gasmor
    I giorni della settimana li ho scritti in quel modo per semplificare la lettura dei record. In realtà sono dei TIMESTAMP.

    Comunque vorrei riuscire a risolvere con una sola query.
    Allora ti basta fare una query con ORDER BY data DESC e se ti servono solo un tot di record aggiungi il LIMIT.

  5. #5
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    Originariamente inviato da F@bius
    Allora ti basta fare una query con ORDER BY data DESC e se ti servono solo un tot di record aggiungi il LIMIT.
    Questa cosa non può funzionare correttamente perchè non è detto che entro il limite che imposto trovo ciò che mi serve.
    Se faccio, ad esempio, LIMIT 0,5 e i primi 5 risultati trovati sono tutti dello stesso autore ottengo 1 solo record.

    Chiaro?
    Hai provato a creare un sito con Jaaxo Cms PHP5? new!

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    set @aut:= "",@num:=1;
    select * from (
    select *,
    	@num:=if(@aut=autore,@num+1,1) as riga,
    	@aut:= autore as a
    from tabella
    order by categoria,data desc) as tab
    having riga = 1 and categoria = 'auto' limit 2

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Prova anche così, almeno ti risparmi una query. Mi sembra che vada bene.

    codice:
    select c1.*
    from tabella as c1
    inner join (select * from tabella order by data desc ) as c2
    on c1.id = c2.id
    where c1.categoria = 'auto'   
    group by c1.categoria,c1.autore 
    order by c1.data desc
    limit 2

  8. #8
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    Originariamente inviato da nicola75ss
    Prova anche così, almeno ti risparmi una query. Mi sembra che vada bene.

    codice:
    select c1.*
    from tabella as c1
    inner join (select * from tabella order by data desc ) as c2
    on c1.id = c2.id
    where c1.categoria = 'auto'   
    group by c1.categoria,c1.autore 
    order by c1.data desc
    limit 2
    Sei un grande, funziona!

    Mi spieghi cosa hai fatto in pratica?
    Hai provato a creare un sito con Jaaxo Cms PHP5? new!

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Ho fatto un join tra la tabella e se stessa. Ordinando per date decrescenti e raggruppando per categoria e autore ho recuperato per ciascun gruppo la data più recente. Infine dal sottoinsieme restituito dalla query ho riordinato ulteriormente per date decrescenti limitandomi ai primi 2 risultati.

  10. #10
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    Originariamente inviato da nicola75ss
    Ho fatto un join tra la tabella e se stessa.
    è questo che non capisco: perchè è stato necessario fare in questo modo? :master:
    Hai provato a creare un sito con Jaaxo Cms PHP5? new!

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.