Visualizzazione risultati 1 fino 3 di 3

Discussione: [MySQL] Query complesse con vari COUNT()

  1. #1
    Guest

    Predefinito [MySQL] Query complesse con vari COUNT()

    Avrei necessità di fare una query che mi dia come risultato i titolo dei dischi di una band, il numero di recensioni presenti per ogni disco, il numero di commenti e il numero di utenti che li hanno inseriti tra i preferiti. Finora per ignoranza (tuttora non so se sia fattibile altrimenti) facevo una query per ottenre la lista dei dischi e per ogni disco una query per ottenere ogni risultato. Vorrei ottimizzare un po' la cosa e farlo attraverso una singola query.
    La query che uso è questa:

    SELECT d. * , count(c.id_disco ) AS totc, count( r.id_disco ) AS totr
    FROM m_dischi d
    LEFT JOIN m_d_commenti c ON c.id_disco = d.id
    LEFT JOIN recensioni r ON r.id_disco = d.id
    WHERE id_artista =1
    GROUP BY disco

    Finché non ci sono recensioni mi da i dati corretti ( X commenti, 0 recensioni) ma quando ci sono anche recensioni mi fa la somma di recensioni e commenti, visto che c'è il GROUP. C'è modo per ovviare a questo problema? Se non è possibile farlo con MySQL sarà possibile farlo con degli array in PHP, ma in questo momento preferirei puntare a una soluzione alla radice :D

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    A parte che per esperienze personali il MySQL di AlterVista sembra avere seri problemi con le query di raggruppamento, quella query però sembra sbagliata: nella clausola GROUP BY andrebbero scritti (tutti) gli attributi su cui si vuole raggruppare (nel tuo caso, e se ho capito bene, dovrebbero essere i dati della tabella d / m_dischi). Prova a scriverci quindi d.* oppure m_dischi.*, oppure l'elenco degli attributi che compongono questa tabella (non li hai specificati quindi non so dirti in dettaglio)...
    Se ancora non funzionasse, prova ad eseguire la query come l'hai scritta in phpMyAdmin e vedere qual è l'errore che ti viene riportato...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    Non ti seguo... il GROUP deve essere fatto su una colonna non su una tabella, infatti mettendo GROUP BY d.* mi da errore di sintassi "near .*", faccendo il group sulla tabella mi da errore "unkonwn column m_dischi".

    Un risultato che ottengo è questo:

    id id_artista disco anno tracklist totc totr
    2849 1 Are You Dead Yet? 2005 [BLOB - 163 Bytes] 41 0
    2 1 Follow The Reaper 2001 [BLOB - 170 Bytes] 62 62

    Per "are you dead yet?" ci sono 41 commenti e 0 recensioni, giusto
    Per "follow the reaper" ci sono 62 commenti e una recensione. La stessa recensione però viene estratta dal DB per ogni commento presente, e viene quindi contata 62 volte (o almeno così sembra).

    Con questa query senza GROUP:

    SELECT d. * , c.id AS totc, r.id AS totr
    FROM m_dischi d
    LEFT JOIN recensioni r ON r.id_disco = d.id
    LEFT JOIN m_d_commenti c ON c.id_disco = d.id
    WHERE id_artista =1

    vedo che effettivamente gli ID dei commenti cambiano, mentre quelli delle recensioni sono sempre gli stessi.


    EDIT: Ho trovato:
    Basta mettere COUNT(DISTINCT r.id) AS totr:

    SELECT d. * , count(DISTINCT c.id ) AS totc, count( DISTINCT r.id ) AS totr, count( DISTINCT p.id ) AS totp
    FROM m_dischi d
    LEFT JOIN m_d_commenti c ON c.id_disco = d.id
    LEFT JOIN recensioni r ON r.id_disco = d.id
    LEFT JOIN m_d_preferiti p ON p.disco=d.disco
    WHERE id_artista =243
    GROUP BY disco
    ORDER BY anno

    In questo modo ottengo il numero reale di commenti,recensioni e preferenze. Grazie comunque per la risposta ;)


    FunCool: Non scrivere due messaggi consecutivi, utilizza il tasto Edita.
    Ultima modifica di funcool : 10-02-2007 alle ore 15.31.44

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •