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

    Prossimo in ordine alfabetico

    Su un programma in stile LAMP, ho un'anagrafica:

    ID, Nome, Cognome, Data_Di_Nascita

    All'interno del programma ho due pulsanti che devono permettermi di selezionare o la successiva scheda (in ordine alfabetico) o la precedente.

    Ad esempio:

    1, Claudio, Baglioni, '2000-10-30'
    33, Salvatore, Baglieri, '1984-10-30'
    87, Nicola, Adamo, '1909-09-09'

    Se sono posizionato sulla scheda 33 (Salvatore Baglieri):
    - Se premo "successivo", devo posizionarmi sulla scheda numero 1 (Claudio Baglioni)
    - Se premo "precedente", devo posizionarmi sulla scheda numero 87 (Nicola Adamo)

    Tutto sarebbe semplicemente risolto con un:

    SELECT DISTINCT IdAnagrafica FROM anagrafica a WHERE CONCAT(Cognome, Nome) > CONCAT(\"".$_SESSION['cognome']."\", \"".$_SESSION['nome']."\") AND IdAnagrafica <> ".$_GET['id']." ORDER BY CONCAT(Cognome, Nome) ASC LIMIT 1
    Purtroppo non basta, perchè ci sono casi in cui io ho:

    1, Claudio, Baglioni, '2000-10-30'
    33, Salvatore, Baglieri, '1984-10-30'
    44, Salvatore, Baglieri, '1922-10-23'
    87, Nicola, Adamo, '1909-09-09'

    In questo caso devo poter selezionare anche l'altro Salvatore Baglieri (es. il nonno).

    Come risolvo?
    Ubuntu 7.10 - JAVA: JDK 1.6.0 - MSI Megabook S262

    www.digital2b.com
    Gestione Documentale e Archiviazione Ottica Sostitutiva

  2. #2

    Risolto

    SELECT DISTINCT IdAnagrafica FROM anagrafica a WHERE CONCAT(Cognome, Nome) >= CONCAT(\"".$_SESSION['cognome']."\", \"".$_SESSION['nome']."\") AND IdAnagrafica > ".$_GET['id']." ORDER BY CONCAT(Cognome, Nome) ASC, IdAnagrafica ASC LIMIT 1
    Risolto così...
    Ubuntu 7.10 - JAVA: JDK 1.6.0 - MSI Megabook S262

    www.digital2b.com
    Gestione Documentale e Archiviazione Ottica Sostitutiva

  3. #3
    Utente di HTML.it L'avatar di wdb
    Registrato dal
    Nov 2002
    Messaggi
    155
    Scusa, ma se la tabella e' sicuramente ordinata per ID (univoco quindi), perche' non risolvi tutto con un bel:

    Codice PHP:
    SELECT DISTINCT IdAnagrafica 
      FROM anagrafica
      WHERE IdAnagrafica 
    ".$_GET['id']." 
    ORDER BY CONCAT(CognomeNomeASC 
    oppure

    Codice PHP:
    SELECT DISTINCT IdAnagrafica 
      FROM anagrafica
      WHERE IdAnagrafica 
    ".$_GET['id']." 
    ORDER BY CONCAT(CognomeNomeASC 
    a seconda di dove vuoi andare ?

  4. #4
    Originariamente inviato da wdb
    Codice PHP:
    SELECT DISTINCT IdAnagrafica 
      FROM anagrafica
      WHERE IdAnagrafica 
    ".$_GET['id']." 
    ORDER BY CONCAT(CognomeNomeASC 
    Il tuo esempio non funge. Esempio:

    1548,"Abbati","Franco","M","1917-02-27 00:00:00"
    10949,"Abbati","Franco","M","1924-12-04 00:00:00"
    40509,"Abbati","Franco","M","1943-02-13 00:00:00"
    52239,"Abbati","Franco","M","1982-05-23 00:00:00"

    Se eseguo:

    SELECT DISTINCT IdAnagrafica
    FROM anagrafica
    WHERE IdAnagrafica > 1548
    ORDER BY CONCAT(Cognome, Nome) ASC
    Dovrei ottenere 10949 o 40509 o 52239...

    ...invece:
    28327
    53353
    etc..

    mentre con

    SELECT DISTINCT IdAnagrafica FROM anagrafica a WHERE CONCAT(Cognome, Nome) >= CONCAT("Abbati", "Franco") AND IdAnagrafica > 1548 ORDER BY CONCAT(Cognome, Nome) ASC, IdAnagrafica ASC LIMIT 1;
    ottengo:
    10949

    (senza il LIMIT 1, otterrei: 40509 e 52239...)
    Ubuntu 7.10 - JAVA: JDK 1.6.0 - MSI Megabook S262

    www.digital2b.com
    Gestione Documentale e Archiviazione Ottica Sostitutiva

  5. #5
    Utente di HTML.it L'avatar di wdb
    Registrato dal
    Nov 2002
    Messaggi
    155
    Vero!
    Davo per scontato che i record fossero solo quelli da te indicati
    Codice PHP:
    1548,"Abbati","Franco","M","1917-02-27 00:00:00"
    10949,"Abbati","Franco","M","1924-12-04 00:00:00"
    40509,"Abbati","Franco","M","1943-02-13 00:00:00"
    52239,"Abbati","Franco","M","1982-05-23 00:00:00" 
    per i quali la mia query funzionerebbe.

    Ok anche per il limit 1 (non avevo visto che dovevi visualizzare solo il successivo/precedente).

    Un'unica osservazione pero' la faccio sulla tua ultima query (ora purtroppo non ho il tempo di provarla).

    Codice PHP:
    SELECT DISTINCT IdAnagrafica FROM anagrafica a 
    WHERE CONCAT
    (CognomeNome) >= CONCAT(\"".$_SESSION['cognome']."\", \"".$_SESSION['nome']."\") 
    AND IdAnagrafica > "
    .$_GET['id'].
    ORDER BY CONCAT(Cognome, Nome) ASC, IdAnagrafica ASC 
    LIMIT 1 
    Forse mi sbagliero', ma ho paura che con questa query, ordinata per COGNOME+NOME e, nell'ambito di questa, per ID, con le condizioni da te impostate, potresti saltare la gestione di alcuni record significativi.

    Mi viene in mente un cognome piu' pesante ma con un ID piu' leggero...

  6. #6
    Hai ragione...

    Muble muble...
    Ubuntu 7.10 - JAVA: JDK 1.6.0 - MSI Megabook S262

    www.digital2b.com
    Gestione Documentale e Archiviazione Ottica Sostitutiva

  7. #7
    Utente di HTML.it L'avatar di wdb
    Registrato dal
    Nov 2002
    Messaggi
    155
    JavaDisperato, forse una soluzione c'e'; ho fatto qualche giro di prova e sembra funzionare. Prova pure te e dimmi se ti va bene.

    Anzitutto toglierei dalla tua query (non da' fastidio intendiamoci) l'opzione DISTINCT in quanto sicuramente una SELECT sull'ID della tabella (che dovrebbe essere chiave univoca) ritorna una sola ricorrenza.

    Poi ho gestito l'ID ritornato da Sql come un numero composto al massimo da 10 digit (10 e' il mio esempio ma puoi benissimo aumentarlo o diminuirlo in base alla conoscenza della chiave piu' grande che la tabella puo' contenere) utilizzando la Funzione Stringa Sql LPAD().
    La funzione LPAD mi serve per avere una sequenza logica corretta di ID all'interno dello stesso Cognome+Nome.

    La Select per cercare il successivo dovrebbe essere la seguente:

    codice:
    SELECT IdAnagrafica FROM anagrafica 
    WHERE CONCAT(Cognome, Nome, LPAD(IdAnagrafica, 10, 0)) > CONCAT("".$_SESSION['cognome']."\", \"".$_SESSION['nome']."\", LPAD(\"".$_GET['id']."\", 10, 0)) 
    ORDER BY CONCAT(Cognome, Nome, LPAD(IdAnagrafica, 10, 0)) ASC 
    LIMIT 1
    Mentre per cercare il precedente:

    codice:
    SELECT IdAnagrafica FROM anagrafica 
    WHERE CONCAT(Cognome, Nome, LPAD(IdAnagrafica, 10, 0)) < CONCAT("".$_SESSION['cognome']."\", \"".$_SESSION['nome']."\", LPAD(\"".$_GET['id']."\", 10, 0)) 
    ORDER BY CONCAT(Cognome, Nome, LPAD(IdAnagrafica, 10, 0)) DESC 
    LIMIT 1
    In pratica le due istruzioni si differenziano solamente per il ">" piuttosto che "<" e per "ASC" piuttosto che "DESC".

    Controlla il posizionamento della funzione LPAD col valore $_GET['id'] perche' non l'ho provata in PHP ma in Sql e non sono certo che il gioco dei doppi apici sia corretto.


  8. #8
    Risolto così:

    SELECT * FROM (
    SELECT
    IdAnagrafica,
    CONCAT(Cognome, ' ', Nome) as generalita,
    YEAR(DatadiNascita) as datanascita
    FROM anagrafica
    WHERE
    CONCAT(Cognome, Nome, YEAR(DatadiNascita), IdAnagrafica) < CONCAT(\"".$cognome."\", \"".$nome."\", ".$anno_nascita.", ".$id.")
    ORDER BY CONCAT(Cognome, Nome, DatadiNascita) DESC LIMIT 1) as precedente

    UNION

    SELECT * FROM (
    SELECT IdAnagrafica,
    CONCAT(Cognome, ' ', Nome) as generalita,
    YEAR(DatadiNascita) as datanascita
    FROM anagrafica
    WHERE CONCAT(Cognome, Nome, YEAR(DatadiNascita), IdAnagrafica) > CONCAT(\"".$cognome."\", \"".$nome."\", ".$anno_nascita.", ".$id.")
    ORDER BY CONCAT(Cognome, Nome, DatadiNascita) ASC LIMIT 1) as successivo
    ORDER BY generalita ASC, datanascita ASC
    e poi...

    Codice PHP:
    <table class="piccolo" width="100%" border="0" cellspacing="1" cellpadding="0">  
     <?php do { ?>     
    <tr onclick="location.href = 'home.php?id=<?php echo $barranav['IdAnagrafica']; ?>'" class="evidenzia" align="left">       
    <td>
    <?php echo substr(stripslashes($barranav['generalita']), 020); ?>
    </td>       
    <td>
    <?php echo stripslashes($barranav['datanascita']); ?>
    </td>     
    </tr>   
    <?php } while ($barranav mysql_fetch_assoc($set_barranav)); ?>   
    </table>
    Ubuntu 7.10 - JAVA: JDK 1.6.0 - MSI Megabook S262

    www.digital2b.com
    Gestione Documentale e Archiviazione Ottica Sostitutiva

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.