Ciao,Originariamente inviato da carlo2002
Ok, ma vorrei capire. Cercando in Internet vedo che l'Outer Join serve ad estrarre i record di una tabella che non hanno corrispondenza nell'altra.
Nel manuale di riferimento di MySQL l'esempio viene fatto proprio con IS Null
In un articolo di questo stesso sito l'esempio viene riportato con IS NULL ed addirittura con una condizione in piùcodice:SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
Io ti ringrazio che mi hai dato direttamente del codice e sicuramente mi insegna qualcosa e mi tornerà utile, però adesso desidererei capire proprio perchè la Left Outer Join che ho confezionato non funziona.codice:SELECT * FROM ordini as o LEFT JOIN clienti as c ON o.idCliente = c.idCliente WHERE idOrdine > 1000 AND c.idCliente IS NULL
Eppure ho semplicemente usato esempi che ho trovato in Internet.
La pappa pronta l'ho ricevuta ma una spiegazione sarebbe utile visto che informazioni in merito, pur cercando, non ne sto trovando, magari potrebbe tornare utile anche ad altri. Imho
la exists può essere il più delle volte più veloce di una LEFT OUTER JOIN e già questo può essere un buon motivo per usare la seconda invece della prima
In ogni caso
La tua query credo non funzioni a dovere perché stai inserendo nella WHERE condizioni che invece dovrebbero essere presenti nella clausola ON.codice:$query = " SELECT id_utente,nome FROM utenti LEFT JOIN condivisioni ON utenti.id_utente = condivisioni.id_utente_condivisore WHERE id_cosa_da_condividere = '".$_REQUEST['id_cosa_da_condividere']."' AND id_utente <> '".$_dati_utente['id_utente']."' # escludo l'utente che fa la condivisione AND condivisioni.id_utente_condivisore IS NULL ORDER BY nome ASC " ;
Infatti se nella INNER JOIN ciò che metti nella WHERE e ciò che metti nella ON non fa differenza, nella LEFT / RIGHT JOIN la fa e come!
Perché ciò che metti nella ON rientra nelle logiche di "fusione" delle due tabelle, ciò che metti nella WHERE viene applicato come filtro dopo la fusione.
Andando nello specifico, mettere nella WHERE questa parte:
è errato perché se tu vuoi estrarre tutti gli utente che NON hanno quella cosa da condividere, vuol dire che quel campo sarà NULL invece tu gli poni una condizione che deve essere uguale a qualcosa, di conseguenza non ti uscirà nulla, quindi quella condizione va nella clausola ON.codice:id_cosa_da_condividere = '".$_REQUEST['id_cosa_da_condividere']."'
Per il resto dovrebbe andare tutto bene ma ti consiglio di mettere sempre, quando fai delle JOIN la tabella davanti al campo, anche se non hai problemi di ambuigità perché ti aiutano a leggere meglio il codice.
Spero di essere stato chiaro, buona serata![]()