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

    mysql: distinct su un campo solo

    utilizzo una vecchia versione di mysql (mi pare 4.0.18) e ho un problema:

    la mia tabella utente contiene: id, nome, cognome, telefono, ecc.

    per motivi che non sto a spiegare si potrebbe verificare un simile caso:

    row 1:carlo, rossi, 02-44556677
    row 2:carlo massimo, rossi, 02-44556677

    facendo un distinct in questa maniera:
    select distinct telefono, nome, cognome from utente
    ottengo entrambe le righe (perchè varia il nome)

    mentre facendo:
    select distinct telefono from utente
    ottengo una sola riga

    a me servirebbe di ottenere cmq solo 1 riga (è indifferente quale) perchè il numero di telefono è lo stesso; insomma dovrei in qualche maniera fare un distinct sul telefono che però mi tiri fuori anche gli altri dati

    come faccio???(non posso usare le query annidate per via della versione di mysql)

    grazie

  2. #2
    select *
    from ...
    group by telefono
    order by


    il distinct si estende a tutti i campi chiamati.


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

  3. #3
    ok grazie

    un'altra cosa: non posso fare un order by all'interno del group by??
    insomma al posto di fargli tirare fuori una riga a caso fargli prendere magari quella con la data di nascita più recente??
    se metto order by data alla fine della query ordina per data ma sulle righe alle quali è già stata applicata la group by e quindi non funziona

    grazie

  4. #4
    vecchia storia... leggi questo thread. Vai verso gli ultimi post.

    http://forum.html.it/forum/showthrea...hreadid=995055

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

  5. #5
    Originariamente inviato da piero.mac
    vecchia storia... leggi questo thread. Vai verso gli ultimi post.

    http://forum.html.it/forum/showthrea...hreadid=995055
    mi pare d'aver capito che non si possa


    piero un'ultima cosa:

    facendo

    select *
    from ...
    group by telefono

    mi pare che i risultati siano conformi a quello che volevo (se mi sbaglio correggimi pure)

    quello che mi chiedo è: come mai con mysql si puo' applicare il group by ad un singolo campo e tirarne fuori altri? (con gli altri DB mi pare non si possa)
    non è che questa "anomalia" comporta delle anomalie anche nei risultati che io mi aspetto?

    grazie

  6. #6
    mi quoto.

    se tu hai altri valori legati al max(data) non ti verranno presi se non casualmete. E' una storia vecchia. GROUP BY e' un aggregatore. Questo significa che serve a raggruppare e quindi MAX,MIN, COUNT, SUM e quant'altro. degli altri dati se ne fotte. prende il primo record che soddisfa la condizione e ti mette quello, il primo che trova scorrendo la tabella.

    Con le versioni che supportano le query annidate si puo' fare il raggruppamento con un join sulla stessa tabella. Oppure al vecchio modo costruire una tabella temporanea ordinata secondo quello che ti serve e poi agire su questa.

    ti faccio un esempio con le query annidate:

    codice:
    SELECT * 
    FROM 
    (select max(data) as data1 from tabella
    group by fid) as tab1
    left join tabella as tab2 ON tab1.data1 = tab2.data
    ora se lo applichi al tuo caso mi pare sia fattibile se hai mysql >= 4.1.x

    codice:
    SELECT *
    FROM (SELECT MAX(data) as data FROM tabella
             GROUP BY telefono) AS tab1
    LEFT JOIN tabella AS tab2 ON tab1.data = tab2.data
    ORDER BY (data,telefono o quello che ti pare)
    insomma ... quello e' il giro del fumo. GROUP BY e' un aggregatore.... e fa quello che puo' sugli altri campi.

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

  7. #7
    purtroppo ho una versione inferiore

    ma quindi mi sconsigli di usare (ai fini della richiesta che ho fatto nel primo post) la query
    select *
    from ...
    group by telefono

    ??

    a me sembra funzionare (lasciamo stare gli order by)

    grazie e scusa per la confusione

  8. #8
    funziona se non vuoi un record specifico ma solo un record qualunque di quelli che fanno parte del raggruppamento. Se ne vuoi uno specifico la query non e' affidabile.

    tutto qui il succo del discorso. In altre parole sarebbe una query sbagliata se dasse risposte "casuali" quando tu vorresti risposte "specifiche".


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

  9. #9
    ok grazie mille non ti rompo piu'.

    per ora mi va bene così; tra l'altro ho notato che funziona anche aggiungendo dei where (almeno mi pare)

    grazie ancora

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.