Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    48

    [sql] group by + order: inconciliabili?

    Ciao, ho bisogno di una mano sulla seguente query:

    codice:
    SELECT 
      com_blogs.blogs_autore,
      com_blogs.blogs_data,
      com_blogs.blogs_mood,
      com_blogs.blogs_titolo,
      com_blogs.blogs_testo,
      com_blogs.blogs_id,
      phpbb_users.user_id,
      phpbb_users.username
    FROM
      com_blogs
      LEFT OUTER JOIN phpbb_users ON (com_blogs.blogs_autore = phpbb_users.user_id)
    ORDER BY
      blogs_data DESC
    LIMIT 15
    si tratta di estrarre da una tabella "com_blogs" gli ultimi 15 blogs inseriti dagli ultimi 15 blogs inseriti.
    Ora come ora lo fa...ma carica anche piu' di un blog per autore! Li ordina per data e basta insomma...

    Come posso fare a selezionare solo UN blog per autore e a visualizzarli ordinati per data? Credo ci voglia un group by, ma non so dove! Grazie davvero,

    Darìo

    PS il join con phpbb_users serve per la compatibilità con gli utenti di phpbb

  2. #2
    Il GROUP BY trova posizione subito dopo il WHERE se esiste.

    Nel tuo caso va messo prima di ORDER BY.


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

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    48
    SEMBRA funzionare...

    se non fosse che ora sbaglia l'ordinamento! Provo a spiegarmi...

    ora effettivamente viene visualizzato solo un blog/record per autore, ma il recordset viene ordinato in base al campo data del PRIMO blog di ogni autore...quando invece a me serve proprio il contrario, e cioè che vengano visualizzati gli ultimi blog di ogni autore!

    Se per esempio c'è un utente che scrive blogs da un anno e uno che ha iniziato da un mese...beh se l'utente "anziano" posta un nuovo blog, rimane comunque in coda al recordset! come posso risolvere! Grazie di nuovo...

  4. #4
    difatti il GROUP BY funziona con i raggruppamenti. per quanto riguarda il record becca il primo che trova.

    Potresti provare con max(id) e il group by autore.... Fosse mysql 4.1 potresti provare una select annidata.... cosi' forse dovrai fare due query. Prova con max(id) group by autore limit 5, poi se sara' il caso farai un ciclo while ed estrarrai i cinque id trovati....


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

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    48
    non ho la minima idea di come si usi max(id)... non è che mi puooi far eun mini-esempietto? 'azzie lo stesso!

  6. #6
    Originariamente inviato da energia
    non ho la minima idea di come si usi max(id)... non è che mi puooi far eun mini-esempietto? 'azzie lo stesso!
    codice:
    SELECT
      MAX(com_blogs.blogs_id) as max_id 
      com_blogs.blogs_autore,
      com_blogs.blogs_data,
      com_blogs.blogs_mood,
      com_blogs.blogs_titolo,
      com_blogs.blogs_testo,
      com_blogs.blogs_id,
      phpbb_users.user_id,
      phpbb_users.username
    FROM
      com_blogs
      LEFT OUTER JOIN phpbb_users ON (com_blogs.blogs_autore = phpbb_users.user_id)
    GROUP by com_blogs.blogs_autore
    ORDER BY 
      max_id DESC
    LIMIT 15
    Probabile che tu riceva corretto solo il piu' alto blogs_id di ogni autore, ed allora dovrai prendere questo valore che troverai nel campo alias max_id e fare una query puntando direttamente a questo record. Probabilmente il record degli altri dati continuera' ad essere il primoo che trova. E' un limite del DISTINCT e GROUP BY.

    Si potrebbe provare con having max_id ... bisogna far due prove ...

    nel caso di having potrebbe essere:
    codice:
    idem
    .....
    ....
    GROUP by com_blogs.blogs_autore
    HAVING com_blogs.blogs_id = max_id
    ORDER BY 
      max_id DESC
    LIMIT 15
    Ma ripeto bisogna provare.... dirti cosi' al volo e mente stanca... non ci giurerei piu' di tanto.


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

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    48
    ho provato a farlo in EMS my sql manager....sembra essere quello che cercavo! Domani provo con dreamweaver...nel caso...adoro la tua mente stanca! Grazie grazie grazie grazie grazie! Hasta pronto

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    48
    Non va! Ora la query funziona in parte, nel senso che l'ordine degli autori è corretto, ma per ogni autore mi restituisce il titolo del suo primo blog! Come se fa? 'azzie gente...

    Darìo

  9. #9
    Originariamente inviato da energia
    Non va! Ora la query funziona in parte, nel senso che l'ordine degli autori è corretto, ma per ogni autore mi restituisce il titolo del suo primo blog! Come se fa? 'azzie gente...

    Darìo
    Usare il group by o il distinct ha dei limiti. Serve a raggruppare dei valori, non a selezionare delle tuple. In pratica il primo record che incontra che soddisfa il raggruppamento la ricerca scartera' tutti i successivi identici.

    L'unico modo per ricavarci qualcosa e' l'uso di HAVING che funziona con GROUP BY e permette di identificare un record.

    Prova per esempio...
    codice:
    SELECT
      MAX(com_blogs.blogs_id) as max_id 
      com_blogs.blogs_autore,
      com_blogs.blogs_data,
      com_blogs.blogs_mood,
      com_blogs.blogs_titolo,
      com_blogs.blogs_testo,
      com_blogs.blogs_id,
      phpbb_users.user_id,
      phpbb_users.username
    FROM com_blogs
    LEFT OUTER JOIN phpbb_users ON (com_blogs.blogs_autore = phpbb_users.user_id)
    GROUP by com_blogs.blogs_autore
    HAVING com_blogs.blogs_id = max_id 
    ORDER BY max_id DESC
    LIMIT 15
    Rimane valido tutto quanto detto. Cioe' per estrarre determinate tuple il GROUP BY non e' il piu' indicato, specie se le righe sono molte. E sopratutto bisogna studiarsi la query con le tabelle sottomano per capire gli aggiustamenti da fare. Nel senso che chi suggerisce presume delle tabelle ad arte... mentre invece queste potrebbero non esserlo.

    Nel tuo caso non vuoi un vero raggruppamento, ma un record per autore che abbia il max(id) inserito.


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

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.