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

    [MySQL] Ordinamento stringhe alfanumeriche

    Ho la necessità di ordinare i risultati restituiti da un'interrogazione su un campo contenente stringhe alfanumeriche; il risultato atteso dall'utente è il seguente:

    D - 349.251.2 TRA
    D - 349.251.22 PAV
    D - 349.251.22 STA
    D - 349.251.200 PAV
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 349 GAV
    D - 350 ABB


    ma il risultato restituito, ovviamente, è:

    D - 349 GAV
    D - 349.251 2 TRA
    D - 349.251 200 PAV
    D - 349.251 22 PAV
    D - 349.251 22 STA
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 350 ABB


    C'è un modo per ottenere i risultati restituiti secondo il primo ordine?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Un passettino avanti potrebbe essere questo:

    ....... ORDER BY Replace(Campo, ".", " ")

    poi dovrai lavorarci ancora parecchio

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Oppure anche:

    ....... ORDER BY Replace(Campo, " ", ".")

  4. #4
    Grazie ma purtroppo non va, l'ordinamento ottenuto secondo i vostri consigli è:

    D - 349.251.2 TRA
    D - 349.251.200 PAV
    D - 349.251.22 PAV
    D - 349.251.22 STA
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 349 GAV
    D - 350 ABB


  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Si potrebbe ottenere con una logica tipo:
    1) sostituisci i punti con spazi
    2) spezza la stringa ad ogni spazio
    3) ordina in base alla prima parte, poi in base alla seconda e così via

    Ma non sono sicuro che soddisfi le tue necessità ... alla fine i campi andrebbero nuovamente riuniti ... mi viene mal di testa solo ad immaginare una cosa del genere.

    Non puoi cercare di aggirare il problema?

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    E cosi ?
    ....... ORDER BY Replace(Campo, " ", "/")
    Lo spazio ha il codice ASCII 32, il punto ha il codice 46 e lo slash ha 47. Quindi rimpiazzando 32 con 47, lo 'spazio' viene ordinato dopo il punto.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Sì, ma ha detto che
    ....... ORDER BY Replace(Campo, " ", ".")
    non ha funzionato.

    Con questa soluzione dove ci sono i punti restano e dove c'è spazio viene un punto quindi non credo si risolva con "/".

    Scusa Partime ma sei sicuro che sostituendo il punto allo spazio non ti dia il risultato giusto?
    Io ho provato ad ordinare i dati dopo aver sostituito il punto allo spazio e funziona!

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da genespos Visualizza il messaggio
    Sì, ma ha detto che
    ....... ORDER BY Replace(Campo, " ", ".")
    non ha funzionato.

    Con questa soluzione dove ci sono i punti restano e dove c'è spazio viene un punto quindi non credo si risolva con "/".

    Scusa Partime ma sei sicuro che sostituendo il punto allo spazio non ti dia il risultato giusto?
    Io ho provato ad ordinare i dati dopo aver sostituito il punto allo spazio e funziona!
    Con Replace(Campo, " ", ".") sostituisci il carattere ASCII 32 dal carattere ASCII 46 quindi 'spazio' = 'punto' mentre con / ovvero ASCII 47 lo 'spazio' è > al 'punto'.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Non voglio intraprendere una discussione extra rispetto all'oggetto del thread, però:
    Spazio = ascii 32
    Punto = ascii 46
    Slash = ascii 47
    Caratteri numerici = dal 48 al 57
    Caratteri alfabetici maiuscoli = dal 65 al 90
    Caratteri alfabetici minuscoli = dal 97 al 122
    Sostituire il 32 con il 46 o con il 47 rispetto a valori tutti superiori non dovrebbe cambiare molto (se l'ordinamento è alfabetico)
    Se l'ordinamento è per codici ascii allora forse bisognerebbe provare con "@" che ha codice ascii 64 ovvero dopo tutti i numeri ma prima delle lettere.
    (se il criterio è giusto dovrebbe funzionare anche con: ":" ";" "<" "=" ">" "?")

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Non penso sia fattibile con MySQL che non ha il natsort.

    Con un po' di php...
    Codice PHP:
    <?php 
     $array   
    = array();
     
    $array[] = 'D - 349 GAV';
     
    $array[] = 'D - 349.251 2 TRA';
     
    $array[] = 'D - 349.251 200 PAV';
     
    $array[] = 'D - 349.251 22 PAV';
     
    $array[] = 'D - 349.251 22 STA';
     
    $array[] = 'D - 349.251 ABB';
     
    $array[] = 'D - 349.251 ZAC';
     
    $array[] = 'D - 350 ABB';
     
     print 
    "<strong>Ordine naturale stretto</strong></br/>";
     print 
    "Prima :<br/>";
     foreach (
    $array as $value) {
     print 
    "$value<br/>";
     } 
     
     
    natsort($array);
     
     print 
    "Dopo :<br/>";
     
    reset($array);
     foreach (
    $array as $value) {
     print 
    "$value<br/>";
     } 
     
    //----- Rimpiazzo spazio da slash
     
    print "<strong>Ordine naturale corretto</strong></br/>";
     foreach (
    $array as $key => $value) {
        
    $array[$key] = str_replace(' ','/',$array[$key]);
     } 
     
     
    natsort($array);
     
     print 
    "Dopo :<br/>";
     
    reset($array);
     foreach (
    $array as $value) {
      
    $value str_replace('/',' ',$value);
      print 
    "$value<br/>";
     } 
     
    ?>
    Dà.

    Ordine naturale stretto
    Prima :

    D - 349 GAV
    D - 349.251 2 TRA
    D - 349.251 200 PAV
    D - 349.251 22 PAV
    D - 349.251 22 STA
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 350 ABB
    Dopo :
    D - 349 GAV
    D - 349.251 2 TRA
    D - 349.251 22 PAV
    D - 349.251 22 STA
    D - 349.251 200 PAV
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 350 ABB


    Ordine naturale corretto
    Dopo :
    D - 349.251 2 TRA
    D - 349.251 22 PAV
    D - 349.251 22 STA
    D - 349.251 200 PAV
    D - 349.251 ABB
    D - 349.251 ZAC
    D - 349 GAV
    D - 350 ABB
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

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.