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
codice:
SELECT left_tbl.*
  FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
  WHERE right_tbl.id 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 * FROM ordini as o LEFT JOIN clienti as c ON o.idCliente = c.idCliente
WHERE idOrdine > 1000 AND c.idCliente 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.

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
Ciao,
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
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 " ;
La tua query credo non funzioni a dovere perché stai inserendo nella WHERE condizioni che invece dovrebbero essere presenti nella clausola ON.
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:
codice:
id_cosa_da_condividere = '".$_REQUEST['id_cosa_da_condividere']."'
è 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.

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