[MySQL] Problema con LEFT JOIN

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
52
Buongiorno a tutti,
Sto facendo una maschera di ricerca che dà la possibilità di incrociare più dati tra diverse tabelle. La principale di queste tabelle è "dipendenti" che ha una chiave "ID_dipendente" mentre le altre si agganciano a questa tramite il campo omonimo ID_dipendente. La query è la seguente:
PHP:
SELECT DISTINCT matricola, dipendenti.ID_dipendente, nome_completo, nome_articolazione, nome_ufficio, dipendenti.ufficio FROM dipendenti
LEFT JOIN uffici ON ufficio=ID_ufficio LEFT JOIN dipendente_dati_personali ON dipendenti.ID_dipendente=dipendente_dati_personali.ID_dipendente
LEFT JOIN dipendente_familiari ON dipendenti.ID_dipendente=dipendente_familiari.ID_dipendente
LEFT JOIN articolazioni ON dipendenti.articolazione=articolazioni.ID_articolazione
WHERE
matricola LIKE '%$matricola%' AND ....
AND luogo_nascita LIKE '%$luogo_nascita%' AND...
AND familiare_luogo_nascita LIKE '%$luogo_nascita%' AND...
tabelle interessate dalla query: dipendenti, uffici, articolazioni, dipendente_dati_personali, dipendente_familiari

Il contenuto dei campi di ricerca viene inserito nelle variabili ($) tramite PHP. In pratica lasciando tutti i campi vuoti dovrebbe comparirmi l'elenco di tutti i dipendenti. Così è finche non inserisco nel WHERE la ricerca dei campi relativi alla tabella dipendente_familiari. Anche se i campi sono vuoti mi compaiono solo i dipendenti che hanno dei familiari inseriti in anagrafica. Con la LEFT JOIN non dovrebbe cmq trovare tutti i dipendenti a prescindere che abbiano un familiare? Non capisco dove sbaglio.
 
Ultima modifica di un moderatore:
verifica di non avere una clausola tipo
WHERE dipendente_familiari.ID_dipendente is not null
perché questa clausola limita la selezione, estraendo solo gli elementi presenti nelle due tabelle

l'esempio sottostante riproduce l'effetto,
la prima selezione é fatta sulla tabella equivalente alla dipendente_familiari
la seconda selezione é fatta sulla tabella equivalente alla dipendenti
la selezione coincide (una parte é nascosta per ottenere un'immagine non troppo grande)

upload_2018-2-22_11-15-38.png
 
una considerazione,
campi vuoti come clausole di selezione, possono produrre risultati inattesi,
ho sempre preferito aggiungere le clausole quando sono presenti i valori
esempio
PHP:
    . " from caratteristiche"
    . " where 1=1";

  if ($car['ca_cod']) { $sql .= " and ca_cod like '%" . $car['ca_cod'] . "%'"; }
 
Intanto grazie delle risposte.

No purtroppo non ci sono clausole "is not null" (tra l'altro i campi delle tabelle non accettano valori null).

La seconda soluzione che mi hai dato era quella che sto implementando anche io ma ero curioso di capire secondo quale logica i risultati non venissero filtrati correttamente
 
non ci sono clausole "is not null" (tra l'altro i campi delle tabelle non accettano valori null).
bisogna capire come lavorano le clausole con i campi vuoti

mentre con "is not null"
mi riferisco al risultato della join che può essere
"null" se non trovato, oppure
"not null" cioè restituisce il valore del campo se trovato
 
@Francesco_72
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code.gif
quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box inserisci 2.png.JPG

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 
@Francesco_72
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag Vedi l'allegato 4960 quando posti del codice, oppure la funzione codice dalla barra degli strumenti
Vedi l'allegato 4961
Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro

Chiedo scusa, ma trattandosi di un comando MySQL, erroneamente non mi ero posto il problema dell'inserimento come "codice". Vale per il futuro. Grazie ancora a Marino per le risposte
 

Discussioni simili