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

    Query null e is not null

    dunque ho due tabelle
    codice:
    CREATE TABLE IF NOT EXISTS `#__turnipersonaledipendenti` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `dipendente_nome_cognome` varchar(255) NOT NULL default '',
    `dipendente_orario_contrattuale_settimanale` int(11) unsigned NOT NULL default '0',
    `checked_out` int(11) NOT NULL default '0',
    `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00',
    `azienda` int(11) unsigned NOT NULL default '0',
    PRIMARY KEY  (`id`),
    FOREIGN KEY (azienda) REFERENCES `#__turnipersonaleaziende`(id) ON DELETE CASCADE
    ) ENGINE=INNODB CHARACTER SET `utf8` COLLATE `utf8_general_ci`;
    
    CREATE TABLE IF NOT EXISTS `#__turnipersonaleturnom` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `turnom_1settimana_times`  time NULL default NULL,
    `turnom_1settimana_endtimes`  time NULL default NULL,
    `turnom_2settimana_times`  time NULL default NULL,
    `turnom_2settimana_endtimes`  time NULL default NULL,
    `turnom_3settimana_times`  time NULL default NULL,
    `turnom_3settimana_endtimes`  time NULL default NULL,
    `turnom_4settimana_times`  time NULL default NULL,
    `turnom_4settimana_endtimes`  time NULL default NULL,
    `turnom_5settimana_times`  time NULL default NULL,
    `turnom_5settimana_endtimes`  time NULL default NULL,
    `mese` char (2) NOT NULL default '',
    `anno` year(4) NOT NULL default '0000',
    `checked_out` int(11) NOT NULL default '0',
    `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00',
    `dipendente` int(11) unsigned NOT NULL default '0',
    PRIMARY KEY  (`id`),
    UNIQUE (`mese` ,`anno` ,`dipendente`)
    FOREIGN KEY (dipendente) REFERENCES `#__turnipersonaledipendenti`(id) ON DELETE CASCADE
    ) ENGINE=INNODB CHARACTER SET `utf8` COLLATE `utf8_general_ci`;

    Devo estrarre tutti i dipendenti indipendentemente dal fatto che per loro sia stata fatto un turno o meno.

    Quando faccio l'estrazione indico sempre un mese e un anno

    Se faccio una query simile:

    codice:
    SELECT tpt.*,tpd.dipendente_nome_cognome,tpd.dipendente_orario_contrattuale_settimanale,tpd.id as iddipendente 
    FROM #__turnipersonaledipendenti as tpd 
    LEFT JOIN #__turnipersonaleturnom as tpt ON tpt.dipendente = tpd.id 
    WHERE tpd.azienda = 1 AND 
    tpt.mese IS NULL ||  tpt.mese = "1" AND 
    tpt.anno IS NULL || tpt.anno = "2010"


    Avrò tutti i dipendenti solo nel caso nessun dipendente sia stato inserito nella tabella turni (quindi siano tutti null) oppure nel caso rientrino nel mese e nell'anno o siano null.
    Quindi se un dipendente è già presente con un turno per il mese non richiesto nn lo estrae

    non so come impostare il where

  2. #2
    a prescindere tutto il resto...

    nel where non puoi fare un mixer tra AND ed OR. Le OR devono essere tra parentesi altrimenti la precedenza degli operatori farebbe diventare cosi' la tua where:

    codice:
    WHERE tpd.azienda = 1 AND tpt.mese IS NULL
    ||  
    tpt.mese = "1" AND tpt.anno IS NULL 
    || 
    tpt.anno = "2010"
    
    // mentre tu vorresti:
    
    WHERE tpd.azienda = 1 
    AND 
    (tpt.mese IS NULL ||  tpt.mese = "1") 
    AND 
    (tpt.anno IS NULL || tpt.anno = "2010")

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

  3. #3
    Ciao PerioMac purtroppo non va neanche così.
    Il problema è che quando cerco un mese per cui non ho ancora fatto un turno, non mi restituisce i dipendenti che sono presenti con un altro mese.... quindi non sono ne null e ne corrispondo al mese richiesto

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    1,150
    Originariamente inviato da recensito
    Ciao PerioMac purtroppo non va neanche così.
    Il problema è che quando cerco un mese per cui non ho ancora fatto un turno, non mi restituisce i dipendenti che sono presenti con un altro mese.... quindi non sono ne null e ne corrispondo al mese richiesto
    Primo, non capisco perche' usi due campi per la data?
    Tra l'altro e' la prima volta che vedo un campo che si definisce come YEAR. C'e' un motivo specifico?

    Secondo, perche' il valore di default e' definito cosi'?

    Codice PHP:
    `mesechar (2NOT NULL default '',
    `
    annoyear(4NOT NULL default '0000'
    Se deve essere in questo modo, cambia la condizione con NULL.

  5. #5
    Originariamente inviato da recensito
    Ciao PerioMac purtroppo non va neanche così.
    Il problema è che quando cerco un mese per cui non ho ancora fatto un turno, non mi restituisce i dipendenti che sono presenti con un altro mese.... quindi non sono ne null e ne corrispondo al mese richiesto
    avevo preposto un... a prescindere tutto il resto.

    Ho detto questo non per pigrizia, ma perche' non condivido la struttura del database con tutti questi NULL che a mio parere non hanno ragione di esistere ed anche per l'impostazione generale dei campi. Ma siccome non ho la piu' vaga idea del tuo progetto mi limito ad un interlocutorio "a prescindere". Ricordati solo che NULL e' diverso da EMPTY o da un "default" e che NULL non torna da solo nel campo dopo una modifica. vedo per esempio un campo "mese" e "anno" definiti NOT NULL e poi invece nella query cerchi un campo "mese" e "anno" come IS NULL ...

    Insomma nella query il where presentava un evidente errore di utilizzo degli operatori logici AND ed OR ed e' questo che mi son limitato ad indicarti.

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

  6. #6
    Ci tengo a sottolineare che nn uso mysql da tempo e ricordo poco.
    e poi
    BUONE FESTE A TUTTI


    Primo, non capisco perche' usi due campi per la data?
    Tra l'altro e' la prima volta che vedo un campo che si definisce come YEAR. C'e' un motivo specifico?
    Mi occorre solo il mese e l'anno... non devo fare operazioni che li combini e mi sembrava + veloce averle separate...

    non condivido la struttura del database con tutti questi NULL che a mio parere non hanno ragione di esistere ed anche per l'impostazione generale dei campi.
    Per quanto riguarda l'uso dei null come valore di default... bhe il valore è obbligatorio... nn sarà effettivamente mai null se nn prima dell'inserimento....




    Ho fatte diverse prove....continuo a non venirne a capo.
    Come caspita deve essere posta la domanda per estrarre tutti i dipendenti indipendentemente dal filtro posto nel WHERE?
    Cioè se il dipendente nn è presente nella tabella dei turni per il mese richiesto, me lo deve estrarre lo stesso (non dico il turno che nn esiste...ma almeno il dipendente si)

    Vi prego un aiutino ...

  7. #7
    giusto per disperazione l'ho conclusa così

    .....WHERE tpd.azienda = 1 AND
    (
    (tpt.mese = "09" AND tpt.anno = "2010")
    OR NOT EXISTS
    (SELECT d.id FROM jos_turnipersonaledipendenti as d
    LEFT JOIN jos_turnipersonaleturnom as t ON d.id = t.dipendente
    WHERE tpt.mese = "09" AND tpt.anno = "2010"
    GROUP BY t.dipendente)
    )
    in questo modo estraggo i record corrispondendi (dipendenti con tanto di turno) del mese richiesto
    con il secondo filtro estraggo tutti i record presenti per la data non richiesta raggruppandoli per id_dipenente così non ho doppioni dei dipendenti.
    Cioè praticamente mi etrae tutto... potevo anche non mettere il filtro.
    Poi con php faccio il controllo sulla data.
    Sarà una boiata ma sono con l'acqua alla gola

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da piero.mac
    vedo per esempio un campo "mese" e "anno" definiti NOT NULL e poi invece nella query cerchi un campo "mese" e "anno" come IS NULL ...
    magari perché sono nella tabella di destra di una left join...

    @recensito: il tuo problema sulla query iniziale è che le condizioni sul mese e sull'anno sono condizioni di join, quindi andavano nella clausola ON e non nella WHERE.

    codice:
    .......
    LEFT JOIN #__turnipersonaleturnom as tpt ON (tpt.dipendente = tpd.id and tpt.mese="1" and tpt.anno="2010")
    WHERE tpd.azienda = 1

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.