Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Aiuto sql & php

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4

    Aiuto sql & php

    Ciao ragazzi, sono nuovo qui sul forum ma me vostre guide mi conoscono ormai da tempo
    Ma andiamo al sodo:
    Devo fare il seguente script:
    Estrazione dal db (mysql) di una lista dati (colonne), stoccaggio dei dati in array (se possibilmente) e poi creazione di un indice del tipo:
    0-9
    007
    119
    200

    A
    Aladino
    ...

    C
    Cayen

    ....
    quindi non la solita query con il "ORDER by .... ASC"

    come potrei fare?
    Grazie

  2. #2
    non so se mysql lo supporta, è una cosa che però ho fatto su DB2: nell'order by invece di metterci il nome di una colonna usi un costrutto case sulla prima lettera della colonna con il contenuto in modo da restituire un valore che ad esempio è 0 per tutti quelli che iniziano con valori tra 0 e 9, poi è 1 per le A, 2 per le B e via dicendo


    Alternativamente, se non hai bisogno di farlo via query sql ma va bene anche con codice php, ci sono svariati modi tra cui anche l'uso di natsort che si occupa di fare l'ordinamento per te o, ancora più comodamente, l'uso di usort accoppiato a strnatcmp

    www.php.net/usort
    http://www.php.net/strnatcmp
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4
    Originariamente inviato da daniele_dll
    non so se mysql lo supporta, è una cosa che però ho fatto su DB2: nell'order by invece di metterci il nome di una colonna usi un costrutto case sulla prima lettera della colonna con il contenuto in modo da restituire un valore che ad esempio è 0 per tutti quelli che iniziano con valori tra 0 e 9, poi è 1 per le A, 2 per le B e via dicendo


    Alternativamente, se non hai bisogno di farlo via query sql ma va bene anche con codice php, ci sono svariati modi tra cui anche l'uso di natsort che si occupa di fare l'ordinamento per te o, ancora più comodamente, l'uso di usort accoppiato a strnatcmp

    www.php.net/usort
    http://www.php.net/strnatcmp
    mmm, potrei farlo pure io con più query tipo
    select nome from db_table WHERE titolo LIKE A% ORDER by NAME ASC

    ma poi dovrei eseguire una marea di query e non penso che non abbi influenze sul server

    invece per netsort e usort come potrei fare?
    Mi faresti un esempio di estrazione dati da un db e ordinamento dati nel modo sopra indicato?
    Grazie

  4. #4
    no, mi sono spiegato male probabilmente

    parlavo di usare
    http://dev.mysql.com/doc/refman/5.1/...#operator_case

    dentro l'ORDER BY

    cosi da restituire un valore fittizzio all'order by e riposizionare per come ti pare e piace i valori

    questa soluzione è composta da una sola query (se funziona come deve, ti ripeto, non ho provato i case con l'order by su mysql) ed è indubbiamente più veloce e performante di quella effettuata tramite php

    edit:

    Ho fatto una prova proprio ora, funziona perfettamente

    Per farti un esempio
    codice:
    SELECT
    SUBSTR(city_name, 1, 1), city_name
    
    FROM
    cities
    
    ORDER BY
    (
    CASE SUBSTR(city_name, 1, 1)
    	WHEN 'z' THEN 1
    	WHEN 'c' THEN 2
    	WHEN 'y' THEN 3
    	WHEN 'i' THEN 4
    	WHEN 'p' THEN 5
    	WHEN 'f' THEN 6
    	ELSE 99
    END
    ) ASC
    questa query tira fuori dalla mia tabella dei comuni la prima lettera ed il nome del comuni mettendo quelli che iniziano per z primi, poi quelli che iniziano per c e sequenzialmente per y, per i, per p, per f e poi tutti gli altri senza distinzione

    questa query dovrebbe fare quello che ti serve, la tabella dei comuni è 8100 record e la risposta è istantanea, 0.069 secondi ... penso che non dovresti avere problemi di peso

    RI-EDIT

    codice:
    SELECT
    (
    CASE SUBSTR(city_name, 1, 1)
    	WHEN 'z' THEN 1
    	WHEN 'c' THEN 2
    	WHEN 'y' THEN 3
    	WHEN 'i' THEN 4
    	WHEN 'p' THEN 5
    	WHEN 'f' THEN 6
    	ELSE 99
    END
    ) AS group_code, city_name
    
    FROM
    cities
    
    ORDER BY group_code ASC
    questa a differenza della precedenza, il codice di raggruppamento te lo restituisce quindi poi puoi stampare i risultati semplicemente verificando quando il contenuto della colonna varia

    Codice PHP:
    $old_group_code '';
    while(
    $row mysql_fetch_assoc($query))
    {
      
    // Verifica se il codice è variato
      
    if ($old_group_code != $row['group_code'])
      {
        
    // Dato che il gruppo è variato stampa l'intestazione del gruppo
        
    echo "Codice gruppo [b]" $row['group_code'] . "[/b]
    \r\n"
    ;
        
        
    // Acquisisce il nuovo codice
        
    $old_group_code $row['group_code'];
      }
      
      
    // Stampa la riga
      
    echo $row['city_name'] . "
    \r\n"
    ;

    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4
    Grazie 100000000000000000000000000000000000000000000000, adesso provo

    Ritornerò con novità

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    4
    scusate il doppio post, comunque:
    le query funzionano benissimo, lo script in php da un errore (Warning: mysql_fetch_assoc() expects parameter 1 to be resource, string given in...) ma il problema è un'altro:
    mi sono spiegato malissimo, anzi, la query è molto utile direi, userò questa d'ora in poi ma non è esattamente quello che mi serviva

    Dato la seguente query:
    Codice PHP:
    "SELECT title_seo, tid,  
    (
    CASE SUBSTR(title, 1, 1)
        WHEN 'a' THEN 1
        WHEN 'b' THEN 2
        WHEN 'c' THEN 3
        WHEN 'd' THEN 4
        WHEN 'e' THEN 5
        ELSE 99
    END
    ) AS lin, title

    FROM
    ipx_topics

    ORDER BY title ASC"

    mi serve per prima cosa sapere come faccio a stampare attraverso array solo i titoli che iniziano per a.
    Seconda cosa:
    vorrei stampare i titoli dei topic di una certa sezione (parliamo di topic di un forum) ma usando while mi stampa tutti di fila senza lasciarmi inserire testi tra i vari risultati che iniziano per una lettera e quelli che iniziano per un'altra lettera, avete capito?
    devo fare una cosa del genere:

    LETTERA A
    Andrea
    Anna
    -- Spazio qui--
    LETTERA B
    Bella
    Barbie
    --Spazio qui --
    LETTERA C
    Carla
    Carmela
    --Spazio qui--
    .....
    è possibile farlo senza usare tanti while e query?
    grazie 1000

  7. #7
    mi sa che dovresti partire dalle basi dell'utilizzo di mysql in php

    www.php.net/mysql_query

    mysql_fetch_assoc vuole una risorsa, restituita da mysql_query o mysql_unbuffered_query, non la query direttamente
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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.