Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505

    MySql - Query che mi ritorna 3 count distinti

    Salve,

    ho 4 tabelle chiamate users, votes, comments e tracklist.

    Fino adesso ritornavo il numero di tracklist per ogni utente, quindi la query era :

    codice:
    SELECT datereg, nickname, count(*) 
    FROM users JOIN tracklist ON nickname=usersub
    GROUP BY nickname 
    ORDER BY count(*) DESC, nickname ASC
    Ora però vorrei ritornare il numero di count di votes, comments e tracklist per ogni utente contemporanemanete (ovviamente se non ci sono votes o comments o tracklist, deve tornarmi count=0). Ho provato con :

    codice:
    SELECT datereg, nickname, count(*) 
    FROM users JOIN tracklist ON nickname=usersub JOIN comments ON nickname=usercom JOIN votes ON nickname=uservote
    GROUP BY nickname 
    ORDER BY count(*) DESC, nickname ASC
    ma non sò come differenziare i 3 count (tantè che mi somma tutto in 1).

    Subqueries? Grazie per l'aiuto

  2. #2

    Re: MySql - Query che mi ritorna 3 count distinti

    codice:
    SELECT u.datereg, u.nickname, count(u.*) as totaleuser, count(t.*) as totaletrack, count(c.*) as totalecommenti, count(v.*) as totalevoti, 
    FROM users u 
    JOIN tracklist t ON u.nickname = t.usersub 
    JOIN comments c ON u.nickname = c.usercom 
    JOIN votes v ON u.nickname = v.uservote
    GROUP BY u.nickname 
    ORDER BY count(u.*) DESC, nickname ASC
    Dovrebbe andare bene, provala

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    mi dice che c'è un errore nella prima riga...(anche togliendo la virgola in fondo)

    Inoltre ho provato ad eseguire una query simile :

    codice:
    SELECT *
    FROM users u 
    JOIN tracklist t ON u.nickname = t.usersub 
    JOIN comments c ON u.nickname = c.usercom 
    JOIN vote v ON u.nickname = v.uservote
    GROUP BY u.nickname
    e per i dati che ho ci mette veramente tantissimo (più di 3 secondi)...

    credo ci sia qualcosa che non và

    Con le subqueries dovrei cavarmela con poche risorse, solo che non mi viene in mente come fare...

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Prova così:

    codice:
    select nickname,
    max(case when colonna = 1 then conta else 0 end) as quanti_t,
    max(case when colonna = 2 then conta else 0 end) as quanti_c,
    max(case when colonna = 3 then conta else 0 end) as quanti_v
    from (
    select nickname, count(t.usersub) as conta,1 as colonna
    from users u
    left join tracklist t on nickname=usersub 
    group by u.nickname
    union all
    select nickname, count(c.usercom),2
    from users u
    left join comments c on nickname=usercom 
    group by u.nickname
    union all
    select nickname, count(v.uservote),3
    from users u
    left join votes v on nickname=uservote
    group by u.nickname ) as t
    group by nickname
    Una volta eseguita la query aggiungi questi indici:

    codice:
    alter table tracklist add index it(usersub);
    alter table comments add index ic(usercom);
    alter table votes add index iv(uservote);
    rilanciala e verifica la differenza del tempo di esecuzione.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    Uhm..la query che mi hai dato è rapidissima. 0.047 sec massimo Quindi non credo ci sia bisogno di ALTER.

    Capista, la facevo più semplice, invece è bella complessa.... GRAZIE!

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da markzzz
    Uhm..la query che mi hai dato è rapidissima. 0.047 sec massimo Quindi non credo ci sia bisogno di ALTER.
    Se i record non sono tanti non ti rendi conto della differenza.
    Al crescere delle dimensioni delle tabelle quegli indici ti serviranno eccome. Mettili.

    P.S. La query è semplice, fa l'unione dei singoli conteggi e poi tramite il campo colonna (1,2,3) col quale identifico a quale query appartengono i singoli record, traspone le righe in colonne.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    Originariamente inviato da nicola75ss
    Se i record non sono tanti non ti rendi conto della differenza.
    Al crescere delle dimensioni delle tabelle quegli indici ti serviranno eccome. Mettili.
    Uhm...li ho messi ora, e già con i dati che ho son passato da 0.047 a 0.031. Ma cosa sono questi "indici"? Non ne ho avevo mai sentito parlare...

    Ora mi informo...

    Originariamente inviato da nicola75ss
    ... poi tramite il campo colonna (1,2,3) col quale identifico a quale query appartengono i singoli record, traspone le righe in colonne.
    Questo è un vero trucco! Sei un asso

    P.S. e se io volessi tornare anche datareg che è un campo della tabella users?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Gli indici servono per velocizzare la ricerca dei record.
    Un'introduzione sommaria la trovi qui

    http://database.html.it/guide/lezione/2447/indici/

    Maggiori dettagli sul manuale ufficiale

    http://dev.mysql.com/doc/refman/5.0/...l-indexes.html

    Per l'aggiunta del campo datareg mettilo in tutte le 4 select.

    edit. Mi correggo. Se ti servono campi supplementari come nel tuo caso, è più efficiente usare un join postumo.

    codice:
    select t.nickname,u2.datareg,
    max(case when colonna = 1 then conta else 0 end) as quanti_t,
    max(case when colonna = 2 then conta else 0 end) as quanti_c,
    max(case when colonna = 3 then conta else 0 end) as quanti_v
    from (
    select nickname, count(t.usersub) as conta,1 as colonna
    from users u
    left join tracklist t on nickname=usersub 
    group by u.nickname
    union all
    select nickname, count(c.usercom),2
    from users u
    left join comments c on nickname=usercom 
    group by u.nickname
    union all
    select nickname, count(v.uservote),3
    from users u
    left join votes v on nickname=uservote
    group by u.nickname ) as t
    inner join users u2 on t.nickname = u2.nickname
    group by t.nickname

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    Join postumo? non credo di aver capito...

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Come puoi vedere nella penultima riga ho usato una inner join per mettere in relazione nickname della tabella che ho creato tramite le union con lo stesso nickname della tabella users.
    In questo modo posso recuperare tutti i campi supplementari della tabella users.

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.