Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    5

    [sql] problema left join

    Salve a tutti,
    sono nuova del forum e non sono molto esperta con il linguaggio sql. Vi volevo chiedere un aiuto riguardo una query sql da fare in una pagina php.
    Ho due tabelle composte in questo modo:

    DIPENDENTI
    descrizione_d //elenco dei dipendenti (20 circa)
    card_number //numero di badge di ognuno

    ACCESSI
    card_number
    data //data entrata dell'utente
    ora //ora entrata utente

    vorrei fare in modo che risulti una tabella dove la prima colonna trovo l'elenco di tutti i dipendenti e nella seconda se è presente o assente in un determinato giorno.
    Nella tabella accessi per un dato giorno, possono non esser presenti tutti i dipendenti.

    Ho provato a scrivere questa query sql:
    SELECT distinct descrizione_d, (case when isnull(data) then 'Assente' else 'Presente' end) as Presenze FROM accessi LEFT JOIN dipendenti on accessi.card_number=dipendenti.card_number where data = '2008-08-08'

    però come risultato mi da solo i dipendenti presenti e non quelli assenti.

    Mi potete dare una mano??
    Grazie in anticipo a tutti quelli che mi risponderanno.
    Ciao

  2. #2
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    hai porvato a inverte le tabelle ?

    SELECT distinct descrizione_d, (case when isnull(data) then 'Assente' else 'Presente' end) as Presenze FROM dipendenti LEFT JOIN accessi on dipendenti.card_number =accessi.card_number where data = '2008-08-08'

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    5
    Ciao,
    grazie per la risposta!!!

    Si si ho già provato e mi da lo stesso risultato. Non capisco perchè... in teoria con una left join dovrei visualizzare tutto l'elenco della tabella dipendenti... e invece visualizzo solo quelli in cui trova la data nella tabella accessi....
    Se per favore poteste dirmi dove sbaglio...
    Grazie

  4. #4
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    caspita... avevo letto male...

    allora secondo me non riesci a risolvere con una solo query ma dovresti fare cosi:

    fare l'estrazione di tutti i dipendenti e per ogni dipendente vedere se è presente interrogando la tabella accessi.

    Ti spiego il motivo: se un dipendente è assente il giorno '2008-08-08' , semplicemente NON è presente nella tabella accessi con data '2008-08-08', giusto?
    Quindi il tuo left join non lo trova....

    spero di essere stato chiaro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    5
    Ciao,
    sei stato chiaro però volevo fare la stessa cosa con la data nella query che ho scritto. Cioè pensavo che usando il left join mi estraesse tutti i dipendenti della tabella dipendenti e poi se trova la data '2008-08-08' in accessi (relativa al dipendente) scrive 'presente', altrimenti 'assente'.

    è sbagliato il ragionamento??? è sbagliata la query???

    Grazie a tutti

  6. #6
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    no, non funziona cosi...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    5
    eh già infatti non funziona

    Seguendo il tuo consiglio ho scritto una cosa di questo genere:

    select distinct descrizione_d, (case when isnull(select distinct data as Pres from accessi
    where accessi.card_number = dipendenti.card_number and data = '2008-08-08')then 'Assente' else 'Presente' end)as Presenza from dipendenti;

    però mi da un errore di sintassi...
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select distinct data as Pres from accessi
    where accessi.card_number = dipende' at line 1

    ho fatto un casino???? scusa ma sono alle prime armi...

  8. #8
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    secondo me, dovresti fare una combinazione tra sql e codice php, ossia:
    Codice PHP:
    $sql "select * from dipendenti " ;

    $result mysql_query$sql ) or die( mysql_error() . "
    $sql ) ;

    while ( 
    $valorimysql_fetch_array$result ) ) {
         
    $dipende $valori["dipende"];

          
    //cerco per ogni dipendente quando è stato presente dalla tabella accessi
         
    $sql2 "select * from accessi where card_number = "$dipende  " AND data = '2008-08-08' order by data DESC";


        
    $result2 mysql_query$sql2 ) or die( mysql_error() . "
    $sql2) ;

       
    //verifico se è presente
       
    if ( mysql_num_rows$result2 ) == ) {
          echo 
    $dipende  " è presente
    ;
       }else{
          echo 
    $dipende  "NON è presente
    ;
       }

    questa è solo un'idea di come puoi risolvere... probabilmente ce ne saranno anche altre
    PS non ho controllato proprio tutto, forse manca qualche ; o altri errorini

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    5
    Ciao,
    ho fatto due semplici modifiche perchè non andava...

    $sql = ("select * from dipendenti ") ;

    $result = mysql_query( $sql ) or die( mysql_error() . "
    " . $sql ) ;

    while ( $valori= mysql_fetch_array( $result, MYSQL_NUM ) ) {
    $dipende = $valori[0];


    //cerco per ogni dipendente quando è stato presente dalla tabella accessi
    $sql2 = ("select * from accessi where card_number = '$dipende' AND data = '2008-08-08' order by data DESC");


    $result2 = mysql_query( $sql2 ) or die( mysql_error() . "
    " . $sql2) ;

    //verifico se è presente
    if ( mysql_num_rows( $result2 ) != 0 ) {
    echo $dipende . " Presente
    " ;
    }else{
    echo $dipende . "Assente
    " ;
    }
    }

    Adesso pare funzionare...
    Ti ringrazio tantissimo per l'aiuto!!! grazie mille!!!!
    Ciao

  10. #10
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896

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 © 2024 vBulletin Solutions, Inc. All rights reserved.