Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Un GROUP BY più intelligente?

    Salve a tutti,
    ho una questione che non riesco a risolvere, magari è una stupidaggine, ve la sottopongo.

    Allora, mettiamo di avere la tabella "messaggi" così impostata:

    IDMSG | IDTHREAD | MITT | DEST | MSG | LETTURA
    5 | 131 | 422 | 19282 | ciao | 0
    7 | 131 | 19282 | 422 | ciao | 0
    23 | 131 | 422 | 19282 | ciao | 0
    25 | 131 | 19282 | 422 | ciao | 0
    32 | 131 | 422 | 19282 | ciao | 1

    Ora, come vediamo la discussione 131 ha 5 msg di cui 1 da leggere.

    La mia query sarà qualcosa tipo:

    Codice PHP:
    SELECT FROM msg WHERE dest 19282 GROUP BY idthread ORDER BY lettura DESCidmsg 
    La mia necessità è di avere una view della casella di posta con tutti messaggi raggruppati per utente/thread (come ormai si fa oggi) del tipo:

    [NUOVO MSG] Da Nicketto1999
    [MSG] Da Paoletta
    [MSG] Da AlteaZzz
    [MSG] Da Federico

    Il problema del GROUP BY in questo caso è che lui mi prenderà il primo messaggio del thread che ho raggruppato, facendomi quindi perdere lo status di lettura o meno del messaggio.

    Ad esempio, se faccio la select del thread 131 (quello che ho postato sopra) raggruppata, lui mi prenderà l'idmsg 5 e quindi non saprò mai se quel thread contiene un msg da leggere (come effettivamente è, vedi idmsg 32).

    Come ne esco?
    Spero di essere stato chiaro, chiedo scusa se non lo sono stato sufficientemente io.

    Pensavo di fare 2 query con 2 cicli diversi, uno per i nuovi msg e l'altro per tutti quelli già letti, ma è una soluzione poco performante forse.

    Grazie a tutti!

    Perchè uso Maxthon? | Mi piace questa chat

  2. #2
    potresti aggiungere SUM(Lettura) nella select. se è 0, tutti i messaggi sono stati letti

  3. #3
    mi sfugge il perche' del group by se la selezione viene condizionata dal where.

    Potresti aggiungere idthread al where. mi pare che li stai cercando tutti e non solo quelli da leggere.

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

  4. #4
    Originariamente inviato da piero.mac
    mi sfugge il perche' del group by se la selezione viene condizionata dal where.

    Potresti aggiungere idthread al where. mi pare che li stai cercando tutti e non solo quelli da leggere.
    Ho ovviamente semplificato di molto la query.
    Faccio il GROUP BY perchè vorrei vedere solo il titolo della discussione (proprio come il forum) anzichè tutti i messaggi esplosi.

    Ad Esempio, immagina che sia la tua casella di posta, ora è cosi:

    [MSG Nuovo] Da Bukowski
    [MSG] Da Bukowski
    [MSG] Da Bukowski
    [MSG] Da Ocip900
    [MSG] Da Bukowski
    [MSG] Da Bukowski
    [MSG] Da Ocip900

    Il Group BY mi serve per farla diventare semplicemente cosi:

    [MSG Nuovo] Da Bukowski
    [MSG] Da Ocip900

    Il mio problema appunto, è come capire se dentro la discussione con Bukowski c'è un messaggio nuovo oppure no.

    Ora provo con il SUM suggerito da optime
    A tal proposito, ma posso fare un order by per SUM vero? Mi pare di si.
    Perchè uso Maxthon? | Mi piace questa chat

  5. #5
    puoi fare la ORDER BY n, dove n è un numero corrispondente alla colonna nella select

    es

    SELECT nome, cognome FROM tabella ORDER BY 2

    ordina per cognome

  6. #6
    Prova cosi:

    codice:
    SELECT 
    IDTHREAD, 
    SUM(CASE WHEN LETTURA=0 THEN 1 ELSE 0 END) MSG_NONLETTI,
    SUM(CASE WHEN LETTURA=1 THEN 1 ELSE 0 END) MSG_LETTI
    FROM TB_POST
    GROUP BY IDTHREAD
    ti restituisce per ogni thread il numero di messaggi letti e non.
    Come indicato da optime puoi ordinare mettendo order by n dove nel caso sopra indicato è ORDER BY 2 o ORDER BY 3


    Ciao
    Mik

  7. #7
    Sto facendo dei test e mi sembra che l'idea del SUM sia davvero valida.

    Grazie a tutti

    Perchè uso Maxthon? | Mi piace questa chat

  8. #8
    Riciao a tutti, mi sono ricordato dov'era il problema "reale" della questione che infatti mi si è presentato in una simulazione appena adesso.

    Il problema come ho già detto è che il GROUP BY fa un raggruppamento un pò alla cavolo di cane, quando invece avrei bisogno dell'ultimo dato di un determinato raggruppamento.

    Faccio un esempio che semplifica il tutto, aggiungendo ad esempio una data (la scrivo fittizia):

    IDMSG | IDTHREAD | MITT | DEST | MSG | LETTURA | DATA
    5 | 131 | 422 | 19282 | ciao | 0 | ieri
    7 | 131 | 19282 | 422 | ciao | 0 | ieri
    23 | 131 | 422 | 19282 | ciao | 0 | oggi
    25 | 131 | 19282 | 422 | ciao | 0 | oggi
    32 | 131 | 422 | 19282 | ciao | 1 | adesso

    Ora, quando vado a fare un GROUP BY del thread 131, avrei necessità di avere, come dato da stampare, l'ultimo della corsa, come se fosse un order by dentro un GROUP BY.

    Invece ora ho una view molto disordinata dove, ad esempio, è facile che me ne prenda uno a caso, vedendo in pagina quindi qualcosa di simile:

    [NEW MSG] Bukowski | ieri
    [MSG] Peppino | oggi
    [MSG] Claudio | ieri
    [MSG] Francesco | oggi

    C'è un tips per Ordinare un raggruppamento?

    Chiedo troppo vero?
    Perchè uso Maxthon? | Mi piace questa chat

  9. #9
    il problema e' che sia distinct che group by prendono il primo record che fisicamente incontrano nella tabella e che risponde a quanto richiesto.

    Quando non ancora esistevano le subquery si creava una tabella temporanea ordinata per LETTURA DATA DESC. La query eseguita quindi trovava come primo il record da leggere.

    es.:

    codice:
     
    (una sola query)
    
    create temporary table pippo
    select * from tabella
    where IDTHREAD = 131
    order by LETTURA DESC, DATA DESC;
    
    [a seguire altra query]
    
    select * from pippo
    group by    -- dovrebbe essere il mittente e non il thread;
    Quando chiudi la connessione la tabella pippo scomparira'.
    Si potrebbe fare anche con delle subquery prelevando l'id del record interessato.

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

  10. #10
    Ciao Piero,
    ero tornato per inserire proprio un esempio simile che ho trovato e che effettivamente funziona. Ho scoperto essere una limitazione abbastanza conosciuta.

    Io faccio con una subquery:

    SELECT * FROM (select * from tabella
    WHERE utente = 10
    order by LETTURA DESC, DATA DESC)
    GROUP BY idthread
    ORDER BY lettura

    Cosi ho "ordinato" il GROUP BY.

    Credo sia simile al tuo esempio.

    Perchè uso Maxthon? | Mi piace questa chat

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 © 2026 vBulletin Solutions, Inc. All rights reserved.