Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [MySQL] Ordinamento per quantità di campi senza raggruppamento

    Ho una ipotetica tabella books:

    codice:
    +----------+----------+----------+
    | book_id  |  author  |  title   |
    +----------+----------+----------+
    |    1     |  Smith   |   Food   |
    +----------+----------+----------+
    |    2     |  Oliver  |   Water  |
    +----------+----------+----------+
    |    3     |  Smith   |   Air    |
    +----------+----------+----------+
    |    4     |    Yu    |  Light   |
    +----------+----------+----------+
    |    5     |  Oliver  |   Heat   |
    +----------+----------+----------+
    |    6     |  Oliver  |  Space   |
    +----------+----------+----------+
    su cui farò una semplice SELECT per leggere tutte le righe:
    SELECT author, title FROM books

    Per sapere il numero di libri per autore dovrei lanciare una apposita query con clausola di raggruppamento:
    SELECT author, COUNT(*) AS book_num FROM books GROUP BY author ORDER BY book_num DESC

    È possibile che la prima query da sola ordini il result set in base alla quantità di libri per autore?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Fossi in te proverei con un sano merge delle tue due query:

    codice:
    SELECT author, title, COUNT(*) AS book_num FROM books GROUP BY author ORDER BY book_num DESC

  3. #3
    Originariamente inviato da ntd
    Fossi in te proverei con un sano merge delle tue due query:

    codice:
    SELECT author, title, COUNT(*) AS book_num FROM books GROUP BY author ORDER BY book_num DESC
    Non hai capito bene cosa cercavo.
    La tua query non restituisce tutte le righe, ma solo le righe dei diversi autori (nell'esempio 3 righe anziché 6).

    A me servirebbe l'ordinamento della seconda query però sulla prima query.
    Essendo un ordinamento legato necessariamente alla clausola "GROUP BY" mi chiedevo se fosse possibile anche senza di essa, ma immagino proprio che non sia possibile.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  4. #4
    Originariamente inviato da emanueledg
    Non hai capito bene cosa cercavo.
    La tua query non restituisce tutte le righe, ma solo le righe dei diversi autori (nell'esempio 3 righe anziché 6).

    A me servirebbe l'ordinamento della seconda query però sulla prima query.
    Essendo un ordinamento legato necessariamente alla clausola "GROUP BY" mi chiedevo se fosse possibile anche senza di essa, ma immagino proprio che non sia possibile.
    dovrebbe essere possibile....

    codice:
    SELECT a.author, a.title, num 
    FROM books a,
         (select author, count(*) as num 
         from books b 
         group by author) as tot
    where a.author = tot.author
    order by num desc
    mi pare possa/debba funzionare.

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

  5. #5
    Originariamente inviato da piero.mac
    dovrebbe essere possibile....

    codice:
    SELECT a.author, a.title, num 
    FROM books a,
         (select author, count(*) as num 
         from books b 
         group by author) as tot
    where a.author = tot.author
    order by num desc
    mi pare possa/debba funzionare.
    Funziona perfettamente.
    Puoi spiegarmi la sintassi?

    • Mi sembra che la tabella "a" sia una tabella temporanea creata a runtime (altrimenti i campi a.author e a.title non esisterebbero), e viene creata con "FROM books a" come copia di "books", giusto?
    • La subquery "SELECT author, COUNT(*) AS num FROM books b GROUP BY author" restituisce gli autori raggruppati per numero di record, sempre da una tabella temporanea "b" (mi sembra che la tabella copia "b" si può anche evitare, senza funziona ugualmente)
    • "WHERE a.author = tot.author" non capisco...


    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  6. #6
    Originariamente inviato da emanueledg
    Funziona perfettamente.
    Puoi spiegarmi la sintassi?

    • Mi sembra che la tabella "a" sia una tabella temporanea creata a runtime (altrimenti i campi a.author e a.title non esisterebbero), e viene creata con "FROM books a" come copia di "books", giusto?
    • La subquery "SELECT author, COUNT(*) AS num FROM books b GROUP BY author" restituisce gli autori raggruppati per numero di record, sempre da una tabella temporanea "b" (mi sembra che la tabella copia "b" si può anche evitare, senza funziona ugualmente)
    • "WHERE a.author = tot.author" non capisco...


    non e' che eviti la copia b della tabella togliendo l'alias, semplicemente la chiami "b" invece di books e ti eviti qualunque (probabile o meno) "qui quo qua" con la tabella books alias "a". In pratica hai una tabella base che si chiama books e vai a lavorare in INNER JOIN con i due alias della stessa tabella, tutto qui. Non potresti farlo se avessero lo stesso nome.

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    170
    salve a tutti ,
    sarei interessato ad capire meglio il codice utilizato nella query in quanto non mi risulta molto chiaro grazie a tutti

  8. #8
    Originariamente inviato da nixxo85
    salve a tutti ,
    sarei interessato ad capire meglio il codice utilizato nella query in quanto non mi risulta molto chiaro grazie a tutti
    Guarda questo esempio equivalente, vale mille parole.

    codice:
    create temporary table tot
    SELECT author, count(*) as num 
    FROM books
    group by author;
    
    SELECT a.author, a.title, num
    FROM books a
    inner join tot b on a.author = b.author
    order by num desc;
    e' la stessa cosa ...

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

  9. #9
    Ancor più alla base c'è la sintassi dell'INNER JOIN

    http://database.html.it/guide/lezion...so-delle-join/
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

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.