Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [mysql] Group By

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613

    [mysql] Group By

    Ciao a tutti...

    Esiste un modo per specificare quale dei tanti record, raggruppati tramite il group by, mostrare?

    Non riesco a capire quale criterio usa

    -------------------------
    id label valore
    -------------------------

    1 pippo 1
    2 pluto 3
    3 pippo 5
    -------------------------

    codice:
    SELECT * FROM table GROUP BY label
    Vorrei essere sicuro che mi venga mostrato il record

    3 - pippo - 5

    e non

    1 - pippo - 1

    a priori IO non so quale venga mostrato

    P.S. La chiave è univoca ma è formata da 3 campi nel mio caso reale (e non da un id progressivo)

    Sono stato spiegato?
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  2. #2
    il criterio usato da group by (e da distinct) e' quello di prendere il primo record incontrato nella tabella che soddisfa la richiesta espressa e scartare tutti gli altri simili. Group by puo' essere ulteriormente selettivo usando HAVING, ma having lavora solo sui record estratti che hanno soddisfatto la condizione del GROUP BY.

    In altre parole GROUP BY serve per fare raggruppamenti e non per estrarre un determinato record a scelta. Se quello che ti serve e' sempre l'ultimo record (max valore) potresti ricorrere al trucchetto, buono per tutte le versioni di mysql, di fare una tabella temporeanea ordinata in modo discendente. Per esempio:
    codice:
    CREATE TEMPORARY TABLE temp
    SELECT * FROM table
    ORDER BY valore DESC;
    
    altra query a seguire:
    
    SELECT * FROM temp
    GROUP BY label
    ORDER BY ....

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Caput..

    Grazie ma purtroppo non posso ordinare nulla per valore (SGRUNT)

    Magari ora descrivo meglio il problema e poi lo posto.. grazie ancora
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Le tabelle coinvolte sono due

    TABLE addebiti
    ---------------------------------------------
    id_addebito
    addebito
    id_sezione
    etichetta
    sub_etichetta
    fascia_soc
    desc_fascia_soc
    desc_f_oraria
    tipo_addebito
    fattore_moltiplicativo
    ---------------------------------------------


    TABLE listini_addebiti
    ---------------------------------------------
    id_listino
    id_addebito
    fascia_soc
    desc_f_oraria
    valore
    ---------------------------------------------

    La query che ho scritto è
    codice:
    SELECT A. * ,
    IF (
    NOT STRCMP( LA.id_listino, 2 ) , LA.id_listino, NULL
    ),
    IF (
    NOT STRCMP( LA.id_listino, 2 ) , LA.valore, NULL
    )
    FROM addebiti AS A
    LEFT JOIN listini_addebiti AS LA
    USING ( id_addebito, fascia_soc, desc_f_oraria )
    WHERE A.tipo_addebito = 'PL'
    GROUP BY id_addebito, fascia_soc, desc_f_oraria
    Sono in possesso dell'id del listino (Ex: 2)!

    Nella tabella "addebiti" ho tutte le possibili tipologie di addebito. A me servono solo quelle con campo tipo_addebito = 'PL'
    La chiave univoca per questa tabella è formata dai tre campi id_addebito, fasica_soc, desc_f_oraria

    Nella tabella "listini_addebiti" ho gli addebiti associati al nostro listino con id = 2 e il valore dell'addebito.

    Quello che voglio ottenere sono tutti i record degli addebiti di tipo "PL" (nel mio caso sono sei) che abbiano o meno una corrispondenza per quel listino. Quindi, per esempio, devo ottenre sempre e comunque 6 record che hanno un campo valore definito se nella tabella listini_addebiti esiste il record che lo definisce, altrimenti NULL.

    Capiste?
    Idee?
    Soluzioni?
    Tric e trac?
    Bombe o carrarmati?

    Grazie
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    UP
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  6. #6
    ho capito ben poco... di questa query.

    Forse basterebbe usare right join invece di left join e mettere la condizione where id = 2. Il NULL lo mette per conto suo.

    Poi fare una chiave primaria con tre campi su due tabelle mi pare dispersivo. Fai un indice UNIQUE con tre campi su una tabella, un id autoincrement e usa solo questo per unire le due tabelle... altrimenti sono solo dati duplicati. ma e' tanto per parlare ... non conosco la struttura del db....


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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Con right join non ottengo il risultato desiderato, c'ho provato anche con altre query.

    Con "where id = 2" mi tira fuori solo due record

    La struttura non si può toccare perchè è di un gestionale in funzione da troppo tempo!

    Mo vedo di inventarmi qualcosa... magari se ci ragioni sopra ancora (oltre che a fondere il cervello) riesco a trovare una soluzione non lontana dai tuoi consigli. Grazie
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

  8. #8
    Non puoi nella stessa query fare le due cose.... cioe' estrarre sia dove trovi la corrispondenza sia dove non la trovi... o fai due queries oppure usa UNION (che son sempre due) es:
    codice:
    (select * from addebiti A
    left join listini_addebiti
    USING ( id_addebito, fascia_soc, desc_f_oraria )
    WHERE A.tipo_addebito = 'PL')
    UNION
    (select * from addebiti A
    left join listini_addebiti LA
    USING (id_addebito, fascia_soc, desc_f_oraria)
    WHERE A.tipo_addebito = 'PL'
    AND LA.CONCAT(id_addebito, fascia_soc, desc_f_oraria) IS NULL )
    Prova e aggiusta il tiro...


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

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Provo, grazie
    Conosci te stesso(?)
    (..e allora perchè scassi a me? )

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.