Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Aiuto per una classifica

    Ciao a tutti, per l'ennesima volta avrei bisogno di un aiuto con mysql

    Ho una tabella fatta in questo modo:

    codice:
    MOSTWANTED
    id  | id_gioco 
    1      10              
    2      20              
    3      10              
    4      40             
    5      40             
    6      50             
    7      40 
    8      10              
    9      10    
    10      20
    Vorrei creare quindi una classifica degli articoli che hanno come id "id_gioco".
    Un primo passo è questa query

    codice:
    SELECT t.id_gioco, COUNT(t.id_gioco) AS t_quanti
    FROM tabella AS t
    GROUP BY t.id_gioco 
    ORDER BY t_quanti DESC
    In questo modo ottengo un output del genere
    codice:
    id_gioco | m_quanti
    10              4
    40              3
    20              2
    50              1
    In questo modo sono riuscito a sommare il numero di presenze di ogni singolo articolo.

    Ora io vorrei fare le seguenti cose:

    1) Avere una top ten di questi articoli. Mettiamo che nel database ho decine e decine di articoli io vorrei estrarre solo i primi 10.

    2) Per ogni singolo articolo mostrare la sua posizione in classifica. Qualcosa come "Posizione: 14 su 90" dove 90 è il numero totale di articoli e 14 la posizione del singolo articolo.


    Qualcuno potrebbe darmi una mano?

  2. #2

    Re: Aiuto per una classifica

    Originariamente inviato da Pennywise83
    1) Avere una top ten di questi articoli. Mettiamo che nel database ho decine e decine di articoli io vorrei estrarre solo i primi 10.
    SELECT * FROM
    (SELECT t.id_gioco, COUNT(t.id_gioco) AS t_quanti
    FROM tabella AS t
    GROUP BY t.id_gioco
    ORDER BY t_quanti DESC) AS temp
    LIMIT 10


    2) Per ogni singolo articolo mostrare la sua posizione in classifica. Qualcosa come "Posizione: 14 su 90" dove 90 è il numero totale di articoli e 14 la posizione del singolo articolo.

    SELECT t.id_gioco, COUNT(t.id_gioco) AS t_quanti
    FROM tabella AS t
    GROUP BY t.id_gioco
    ORDER BY t_quanti DESC

    Quando esegui la select devi fare una cosa del genere:

    $i=1;

    while ($row = @mysqli_fetch_assoc($query))
    {
    $articolo = $row['id_gioco'];
    $posizione_articolo[$articolo] = $i;
    $i++
    }

    Cioé ti crei un array in cui l'indice è il contenuto di id_gioco ed in corrispondenza di quell'articolo c'è la sua posizione in classifica. Per intenderci; se vuoi sapere la posizione dell'articolo 40 questa sarà:

    $posizione_articolo[40]

  3. #3
    Grazie mille,
    con il metodo che mi hai suggerito ho intuito molte cose e dovrei riuscire a fare tutto ciò di cui avevo bisogno

    Grazie ancora, nel caso avessi ancora problemi riposterò in questo topic!

  4. #4
    Ho ancora un problemino...

    Questa query:

    SELECT * FROM
    (SELECT t.id_gioco, COUNT(t.id_gioco) AS t_quanti
    FROM tabella AS t
    GROUP BY t.id_gioco
    ORDER BY t_quanti DESC) AS temp

    Mi restituisce, ovviamente, soltanto gli articoli presenti nella tabella chiamata "tabella", io vorrei che comparissero tutti gli articoli della seconda tabella e che avessero come valore "t_quanti" 0...


    Mi spiego meglio. Ho due tabelle:
    MOSTWANTED
    id | id_gioco
    1 10
    2 20
    3 10
    4 40
    5 40
    6 50
    7 40
    8 10
    9 10
    10 20

    e

    ARTICOLI
    id_gioco | nome_gioco
    10 Nome gioco1
    20 Nome gioco2
    30 Nome gioco3
    40 Nome gioco4
    50 Nome gioco5
    60 Nome gioco6
    70 Nome gioco7

    Dato che nella tabella MOSTWANTED non c'è nessun inserimento del gioco "60" e "70" vorrei che la query mi dia come risultato per questi "0"...


    Spero di essere stato chiaro...
    vi prego, è tutto il giorno che mi sto scervellando ma proprio non riesco

  5. #5

  6. #6
    Se ho capito bene tu vorresti crearti una classifica di tutti gli articoli e, quelli, che non compaiono nella tabella MOSTWANTED devono avere associato valore 0.

    Prova così:

    SELECT A.id_gioco, A.nome_gioco, temp.t_quanti
    FROM ARTICOLI AS A
    LEFT JOIN
    (SELECT id_gioco, COUNT(t.id_gioco) AS t_quanti
    FROM tabella
    GROUP BY id_gioco
    ) AS temp ON A.id_gioco=temp.id_gioco
    ORDER BY temp.t_quanti DESC

    Dovresti avere un risultato del genere:

    id_gioco nome_gioco t_quanti
    10 Nome_gioco1 4
    .....
    60 Nome_gioco NULL
    70 Nome_gioco NULL

    Quindi quando prendi il result set dei dati, quando invii l'output a video al posto di NULL fai uscire 0.

  7. #7

    Query annidate per una classifica

    Ciao a tutti, avrei bisogno di un aiuto relativo alle query annidate dato che è la prima volta che mi ci avvicino.


    Ho la seguente tabella

    codice:
    id | articolo | voto | principale
    1    pippo       5         0
    2    pippo       8         1
    3    pippo       9         0
    4    topolino      6         0
    5    topolino       2         0
    6    topolino       4        0
    7    topolino       4        1

    In pratica vorrei calcolare la media dei voti per l'articolo "pippo" ma vorrei fare una distinzione tra "principale = 0" e "principale = 1".

    Il risultato dovrebbe essere il seguente:

    Pippo:
    voto principale: 8
    voto medio: 7 ovvero (9+5)/2

    Topolino:
    voto principale: 4
    voto medio: 4 ovvero (6+2+4)/3

    Potrei farlo tranquillamente annidando un'altra query nel ciclo while ma vorrei avere la possibilità di fare un doppio ordinamento sul voto principale e il voto medio... il risultato della query dovrebbe essere il seguente:

    id | articolo | voto_principale | voto_medio
    1 pippo 8 7
    2 topolino 4 4

    Qualcuno sa aiutarmi?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select articolo,avg(voto) as media from tabella
    group by articolo,principale


    edit. dimenticato il campo principale.

    codice:
    select articolo,principale,avg(voto) as media from tabella
    group by articolo,principale

  9. #9
    Originariamente inviato da nicola75ss
    codice:
    select articolo,avg(voto) as media from tabella
    group by articolo,principale


    edit. dimenticato il campo principale.

    codice:
    select articolo,principale,avg(voto) as media from tabella
    group by articolo,principale
    Mmm... ma così non ottengo quello di cui avevo bisogno...
    In pratica vorrei ottenere da una parte l'unico voto principale, e anche la media degli altri voti (che hanno principale = '0')...

  10. #10
    In pratica, concettualmente, mi servirebbe una query del genere.
    codice:
    SELECT articolo, principale, voto_principale, 
     (SELECT articolo, avg(voto) as media
      FROM tabella
      WHERE principale = '0'
      GROUP BY articolo
      ORDER BY media DESC) AS voto_media
    
    FROM tabella
    WHERE principale = '1'
    ORDER BY voto_principale DESC, voto_media DESC
    Questa query ovviamente non funziona, ma penso si possa fare qualcosa del genere a livello SQl.
    lo ripeto, potrei farlo attraverso una seconda query annidata nel ciclo while ma a me servirebbe avere sia il "voto_principale" che "voto_media" per fare un ordinamento...

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.