Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Moderatore di Motori di ricerca e webmarketing L'avatar di rigby76
    Registrato dal
    Oct 2005
    residenza
    Firenze
    Messaggi
    4,913

    [MySQL] COntare il numero di record di una query con GROUP BY

    Supponiamo di avere una semplice query tipo

    codice:
    SELECT id FROM tab_x
    volendo calcolare il numero di righe che questa query estrae, mi basta sostituire l'id con un count:

    codice:
    SELECT count(id) FROM tab_x
    Supponiamo adesso di dover estendere la query precedente mettendola in join con un'altra e dover usare un group by per recuperare un riga per ogni elemento della prima tabella:

    codice:
    SELECT tab_x.id FROM tab_x LEFT JOIN tab_y ON tab_y.x_id=tab_x.id GROUP BY tab_x.id
    Se io adesso voglio calcolare il numero di righe estratte dalla precedente query, non posso più sostituire il count, dato che ho il group by che mi altera il funzionamento della query... come dovrei fare per ottenere lo stesso risultato?

    Spero di essermi spiegato!

    Grazie
    estremizzo, banalizzo e polemizzo!

    Hai letto le FAQ sui Motori di Ricerca?

  2. #2
    Spiegato mica tanto....

    nella selezione precedente conti senza condizioni. Nella seconda con il join poni una condizione.

    Cosa vuoi dire con ottenere lo stesso risultato?

    raggruppando per tab_x.id conterai tutti gli id di tab_x. Stai usando LEFT JOIN e non una INNER JOIN, quindi conti tutti i record della tabella in FROM.

    SELECT count(tab_x.id) ......

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Moderatore di Motori di ricerca e webmarketing L'avatar di rigby76
    Registrato dal
    Oct 2005
    residenza
    Firenze
    Messaggi
    4,913
    Ciao piero.mac, grazie dell'attenzione. Cerco di spiegarmi meglio.

    Supponiamo che la relazione tra x e y sia di uno a molti, ad esempio x tabella clienti e y tabella ordini.

    La query che devo fare deve estrarre i clienti che abbiano ad esempio almeno 2 ordini fatti, quindi:

    codice:
    SELECT tab_x.id, count(tab_y.id) AS nr_y
    FROM tab_x LEFT JOIN tab_y ON tab_y.x_id=tab_x.id
    GROUP BY tab_x.id
    HAVING nr_y>=2
    Partendo da questa query devo ottenere un'altra query che conti il numero di record estratti dalla prima.

    Se non ho un costrutto group by-having, la soluzione è semplice, come ho segnalato nel primo post. Avendo invece il group by, se io sostituisco alla select il count(tab_x.id), non ottengo una sola riga con il totale dei record, ma n righe per ogni gruppo di tab_x.id.

    Il group by non lo posso togliere perché la clausola in having è fondamentale per calcolare il numero di elementi della tabella x che devo estrarre. Mi chiedevo quindi se esistesse un modo semplice per risolvere questo problema: per ora non mi è venuto in mente.
    estremizzo, banalizzo e polemizzo!

    Hai letto le FAQ sui Motori di Ricerca?

  4. #4
    Non molto piu' chiaro della notte .... ma proviamoci.

    Se ho capito bene tu vorresti il conteggio totale dei tab_x.id (per raggruppamento), ma solo per i record che rispondono alla condizione having .... in questo caso basterebbe contare tab_x

    codice:
    SELECT tab_x.id, count(tab_x.id) AS nr_x
    FROM tab_x LEFT JOIN tab_y ON tab_y.x_id=tab_x.id
    GROUP BY tab_x.id
    HAVING count(tab_y.id)>=2

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Moderatore di Motori di ricerca e webmarketing L'avatar di rigby76
    Registrato dal
    Oct 2005
    residenza
    Firenze
    Messaggi
    4,913
    Io vorrei contare i tab_x.id, ma non per raggruppamento, bensì la somma totale. Il group by mi serve per avere la condizione having, ma nella query che conta non lo vorrei.

    In pratica, contare il numero totale di tab_x.id che soddisfino la condizione having (cioè almeno due elementi della tabella y collegati, nell'esempio citato).
    estremizzo, banalizzo e polemizzo!

    Hai letto le FAQ sui Motori di Ricerca?

  6. #6
    Originariamente inviato da rigby76
    Io vorrei contare i tab_x.id, ma non per raggruppamento, bensì la somma totale. Il group by mi serve per avere la condizione having, ma nella query che conta non lo vorrei.

    In pratica, contare il numero totale di tab_x.id che soddisfino la condizione having (cioè almeno due elementi della tabella y collegati, nell'esempio citato).
    Se raggruppi avrai i risultati raggruppati e' inevitabile.

    O totalizzi sommando con il php oppure prova con una UNION.

    codice:
    SELECT tab_x.id, count(tab_x.id) AS nr_x
    FROM tab_x 
    LEFT JOIN tab_y ON tab_y.x_id=tab_x.id
    GROUP BY tab_x.id
    HAVING count(tab_y.id)>=2
    UNION
    SELECT 'Totale', count(*)
    FROM tab_x 
    LEFT JOIN tab_y ON tab_y.x_id=tab_x.id
    HAVING count(tab_y.id)>=2
    L'ultimo record avra' il Totale dei record presenti con la condizione che siano >= 2

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Moderatore di Motori di ricerca e webmarketing L'avatar di rigby76
    Registrato dal
    Oct 2005
    residenza
    Firenze
    Messaggi
    4,913
    Ok, grazie per la pazienza. Mi studio la query con la union e vedo se fa al caso mio. Altrimenti php!

    estremizzo, banalizzo e polemizzo!

    Hai letto le FAQ sui Motori di Ricerca?

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.