Newsgroup: it.comp.www.php
Titolo: MYSQL e LEFT JOIN, problemino con clausola WHERE

ho 2 tabelle (semplifico un pò):
oggetti
codice PHP:
CREATE TABLE  `prova`.`oggetti` (
`id` INT NOT NULL AUTO_INCREMENT ,
`testo` VARCHAR( 250 ) NOT NULL ,
`prezzo` DECIMAL( 5, 2 ) NOT NULL ,
PRIMARY KEY (  `id` )
) ENGINE = INNODB;
INSERT INTO `oggetti` VALUES(1, 'primo oggetto', 10.10);
INSERT INTO `oggetti` VALUES(2, 'secondo oggetto', 12.84);
------------------------------------------
movimenti
codice PHP:
CREATE TABLE  `prova`.`movimenti` (
`id` INT NOT NULL AUTO_INCREMENT ,
`idOggetto` INT NOT NULL ,
`tipoMovimento` SMALLINT NOT NULL ,
PRIMARY KEY (  `id` )
) ENGINE = INNODB
------------------------------------------
e devo avere una query che mi restituisce id oggetto sempre, e se c'è
il collegamento con la tabella movimenti l'id del movimento,
altrimenti null.
questa è quella che ho scritto:
codice PHP:
SELECT 
oggetti.id
, 
movimenti.id
FROM oggetti
LEFT JOIN movimenti ON ( movimenti.idOggetto = 
oggetti.id
 )
------------------------------------------
e funzionerebbe anche, se la tabella movimenti è vuota mi restituisce
id id
1 NULL
2 NULL
che è giusto, idem se ho un movimento per un solo oggetto:
codice PHP:
INSERT INTO `movimenti` VALUES(1, 1, 2);
------------------------------------------
1 1
2 NULL
ora però io dovrei differenziare per il campo
movimenti.tipoMovimento...
perchè se correggo al query con
codice PHP:
SELECT 
oggetti.id
, 
movimenti.id
FROM oggetti
LEFT JOIN movimenti ON ( movimenti.idOggetto = 
oggetti.id
 )
WHERE movimenti.tipoMovimento = '4'
------------------------------------------
se non ci sono i movimenti non mi restituisce nessuna riga, invece del
idOggetto e NULL?

 idOggetto e NULL?
Semplice, perché nel resultset su cui fai il where non ci sono righe con 
movimenti.tipomovimento = 4, perché sono tutti = null :)
La where ragiona sul recordset prodotto dalla join, semplicemente cerca 
quali record soddisfano la condizione che gli hai imposto: se tu fai una 
left join, nel caso in cui nella seconda tabella non ci sia un record 
corrispondente alla condizione di join, tutti i suoi campi saranno null: 
applicando un filtro su uno di questi campi con un valore che non sia 
null, ovviamente le righe = null vengono escluse.
Se posso dire la mia, questo è un caso tipico in cui si sbaglia il file 
da cui partire: dovresti "partire" sempre dalla tabella che vuoi 
filtrare e che contiene i dati veri e propri e joinarla (usando left o 
no, dipende da cosa vuoi fare) con la/le tabelle di "anagrafica", su cui 
di solito non hai filtri da fare.
-- 
Jax

 idOggetto e NULL?
sei in una stanza con altre tre persone , ognuno di voi ha tre arance in
mano.
dammi la carta di identità di delle persone nella stanza che hanno cinque
arance in mano.
quante carte mi dai ? :)

già ragazzi, ragionandoci poi su dopo un caffè mi sono reso conto che
la query si comporta esattamente come dovrebbe, sono io che ho cannato
del tutto la sua strutturazione..
vi espongo meglio il mio problema:
io ho 5 tabelle:
ordini_vendita
ordini_acquisto
oggetti_vendita
oggetti_acquisto
movimenti
ora, il database poteva tranquillamente essere strutturato molto
meglio, usando un'unica tabella per gli ordini e una per gli oggetti,
ma ora mi trovo a lavorare con quelle tabelle e per un motivo o per
l'altro non posso pensare di ristrutturarlo.. e da qui il mio
problema.
la tabella movimenti è così:
id - idMovimento - idOggetto - tipoMovimento - tipoDocumento
se tipoDocumento è 0, idMovimento e idOggetto si riferiscono
rispettivamente alle tabelle di vendita, se è = 1 alle tabelle di
acquisto.
in questo modo, non posso nemmeno lavorare sulle foreign key -.-
Ora, il mio dubbio è: riesco ad ottenere quello che mi serve con
un'unica tabella movimenti, lavorando il più possibile sulle query, o
mi conviene alla grande sdoppiare la tabella, creando
movimenti_vendita e movimenti_acquisto?