Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: problema unione query

  1. #1

    problema unione query

    Vorrei avere una lista delle località dei miei clienti ordinata per le località con maggior numero di clienti.

    Ho due tabelle:

    Clienti.
    id, cognome, nome, id_localita
    Localita.
    id, localita

    Con il codice sotto riportato riesco a elencare gli id delle località ma non a ordinarli.

    $query="SELECT DISTINCT(id_localita) FROM clienti";
    $result=dbquery($query);
    if (dbrows($result)!=0) {
    while($data=dbarray($result)) {
    echo $data['id_localita'].' :';

    $query2="SELECT * FROM clienti WHERE (id_localita='".$data['id_localita'])."'";
    $result2=dbquery($query2);
    if (dbrows($result2)!=0) {
    echo dbrows($result2);
    }

    echo '
    ';
    }
    }

    Sapreste dirmi dove potrei cambiare il mio codice al fine richiesto, o dove sbaglio nella struttura delle tabelle?
    Prima o poi anch'io vi insegnerò qualcosa

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922

    Re: problema unione query

    Originariamente inviato da riccardo1975
    Vorrei avere una lista delle località dei miei clienti ordinata per le località con maggior numero di clienti.
    codice:
    select l.localita,count(c.id_localita) as quanti
    from clienti as c
    inner join localita as l
    on c.id_localita = l.id
    group by c.id_localita
    order by quanti desc

  3. #3
    Premettendo che sono un'autodidatta e quindi non avvezzo ad usare i comandi appropriati. Proprio per capire meglio l'aiuto che mi vien dato e per farlo capire a chi ne avrà bisogno, ho cercato di strutturare con l'aiuto delle parentesi. (ho anche aggiunto un secondo ordinamento):

    (SELECT l.localita, count(c.id_localita) as quanti FROM ((clienti as c) INNER JOIN (localita as l) ON (c.id_localita=l.id)) GROUP BY c.id_localita)
    ORDER BY quanti desc, l.localita ASC

    Dal mio ragionamento vien fuori terra terra in Italiano:

    Seleziona il campo località l.localita, e la quantità delle località esistenti count(c.id_localita) as quanti dalla tabella che viene fuori unendo INNER JOIN la tabella clienti (clienti as c) con la tabella localita (localita as l) raggruppata per il campo id_localita GROUP BY c.id_localita

    il tutto ordinato per quantità quanti desc e località l.localita ASC

    ahahaha!!!!
    Prima o poi anch'io vi insegnerò qualcosa

  4. #4
    AZZ credevo di riuscire a farlo ma evidentemente le supposizioni non bastano, mi spiego:

    come prendo, sempre nella solita query, i primi 5 in ordine di quantità, ma li riordino e li visualizzo quindi, per esempio, per località?

    Es.

    Firenze: 650
    Livorno: 320
    Milano: 200
    Pisa: 500
    San Remo: 890
    Prima o poi anch'io vi insegnerò qualcosa

  5. #5
    codice:
    SELECT * FROM
    (SELECT TOP 5 ...resto della query che hai già) T1
    ORDER BY localita

  6. #6
    Ora ci studio un pò sopra ma di primo acchito non funziona (nel senso la prima veloce prova non funziona).

    La mie tabelle in realtà sono 4 (localita, comuni, province collegate ad albero):

    Clienti.
    id, cognome, nome, id_localita
    Localita.
    id, localita, id_comune
    Comuni.
    id,comune,id_provincia
    Province.
    id,provincia,sigla_provincia

    La mia query attualmente è questa ed è funzionante:

    $query="(SELECT pr.provincia, pr.sigla_provincia, co.comune, lo.id, lo.localita, lo.cap, count(cl.id_localita) as quanti FROM ((province as pr)
    INNER JOIN (comuni as co) INNER JOIN (localita as lo) INNER JOIN (clienti as cl) ON (cl.id_localita=lo.id) and (co.id=lo.id_comune)
    and (pr.id=co.id_provincia)) GROUP BY cl.id_localita) ORDER BY quanti DESC, pr.provincia ASC, co.comune ASC, lo.localita ASC";


    ovviamente mi prende tutte le località e ordinate per quanti-provincia-comune-localita

    In nessun modo per il momento sono riuscito a prendere i primi 5 record per quanti-provincia-comune-localita figuriamoci poi ad ordinarli (quelli e solo quelli) per provincia-comune-localita.

    Prove, probabilmente insensate mi hanno portato a scrivere:

    $query="(SELECT TOP 5 pr.provincia, pr.sigla_provincia, co.comune, lo.id, lo.localita, lo.cap, count(cl.id_localita) as quanti FROM ((province as pr)
    INNER JOIN (comuni as co) INNER JOIN (localita as lo) INNER JOIN (clienti as cl) ON (cl.id_localita=lo.id) and (co.id=lo.id_comune)
    and (pr.id=co.id_provincia)) GROUP BY cl.id_localita) ORDER BY quanti DESC, pr.province ASC, co.comune ASC, lo.localita ASC";

    oppure

    $query="SELECT TOP 5 * FROM (( SELECT pr.provincia, pr.sigla_provincia, co.comune, lo.id, lo.localita, lo.cap, count(cl.id_localita) as quanti FROM ((province as pr)
    INNER JOIN (comuni as co) INNER JOIN (localita as lo) INNER JOIN (clienti as cl) ON (cl.id_localita=lo.id) and (co.id=lo.id_comune)
    and (pr.id=co.id_provincia)) GROUP BY cl.id_localita) ORDER BY quanti DESC, pr.province ASC, co.comune ASC, lo.localita ASC) T1 ";


    Prima o poi anch'io vi insegnerò qualcosa

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Si può sapere il database in oggetto, cosa che peraltro andrebbe specificata nel titolo del thread.

  8. #8
    Si scusami, mysql di aruba
    Prima o poi anch'io vi insegnerò qualcosa

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Allora non devi usare top, non supportato da mysql, ma limit.
    La mia query, adattata a quanto suggeritoti da optime, diventerebbe

    codice:
    select * from (
    select l.localita,count(c.id_localita) as quanti
    from clienti as c
    inner join localita as l
    on c.id_localita = l.id
    group by c.id_localita
    order by quanti desc
    limit 5) as t
    order by localita

  10. #10
    Grazie veramente mille.

    Solo per chiarezza, chi volesse capire la soluzione sulle 4 tabelle come richiesto in ultima istanza è:

    $query="select * from ((SELECT pr.provincia, pr.sigla_provincia, co.comune, lo.id, lo.localita, lo.cap, count(cl.id_localita) as quanti FROM ((province as pr) INNER JOIN (comuni as co) INNER JOIN (localita as lo) INNER JOIN (clienti as cl) ON (cl.id_localita=lo.id) and (co.id=lo.id_comune) and (pr.id=co.id_provincia)) GROUP BY cl.id_localita) ORDER BY quanti DESC, pr.provincia ASC, co.comune ASC, lo.localita ASC limit 5) as t order by sigla_provincia ASC, comune ASC, localita ASC";


    Grazie Nico e forza Cagliari!!!!!
    Prima o poi anch'io vi insegnerò qualcosa

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.