Newsgroup: it.comp.software.database
Titolo: Aiuto su query...

 ogni riga estratta dalla prima... o me la cavo con una?
non ho capito se è quello che vuoi:
mysql> select * from anagrafiche a, anagrafiche b, anagrafiche c, pratiche 
slave
    -> where slave.a_id1=
a.id
 and slave.a_id2=
b.id
 and slave.a_id3=
c.id
;
la join che viene fuori è notevole se i dati sono medio/tanti.
ciao
ps: sento puzza di cattiva normalizzazione, sicuro che non ti ci volevano 3 
tabelle anziché 2??
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/philosophy/gif.html

Uhm... o sono io oggi ad essere fuso, o non mi viene in mente come scrivere
una query per ottenere il risultato che provo a descrivervi... Sto lavorando
con mysql...
Ho due tabelle, una denominata "anagrafiche" e una "pratiche", nella seconda
ho tre campi (a_id1, a_id2 e a_id3) che fanno riferimento al campo 'id'
della prima e contengono valori diversi l'uno dall'altro. La seconda
tabella, in pratica, è legata a 3 righe della prima.
Mi domandavo come scrivere una query in grado di listare l'intero contenuto
della seconda tabella, facendo corrispondere a ciascuno dei tre campi sopra
indicati il valore che corrisponde a ciascun id nella prima tabella.
Mi servono per forza due query, la seconda delle quali va ripetuta per ogni
riga estratta dalla prima... o me la cavo con una?
Grazie a chi avrà la bontà di rispondere!
Ciao!
--
L.

 volevano 3 tabelle anziché 2??
Hai ragione anche su questo punto... soprattutto visto il fatto che nella
seconda tabella le tre chiavi esterne che si riferiscono alla prima non
sempre sono complete, e talvolta solo una di esse è presente.
Forse mi conviene spezzare la seconda tabella...
Grazie comunque!
--
L.

 volevano 3 tabelle anziché 2??
Approfitto ancora un po' della tua competenza... se posso.
Stavo pensando, dietro tuo consiglio, di spezzare la tabella "fascicoli" in
due, facendo in modo che la nuova tabella serva per congiungerla alla tab.
"anagrafiche".
La nuova tabella, pertanto, dovrebbe essere composta dai campi: id, idfasc
(foreign key tab. fascicoli), idanag (foreign key tab. anagrafiche) e tipo
(ossia il tipo di informazione che vado a scriverci, visto che prima avevo i
tre campi a_id1, a_id2 e a_id3).
Strutturando il database in questo modo... poi come faccio per recuperare le
informazioni ottenendo il risultato della query che mi hai suggerito?
Grazie!
--
L.

 le informazioni ottenendo il risultato della query che mi hai suggerito?
select 
anag.id
 anag, 
fasc.id
 fasc from fascicoli fasc, anagrafiche anag, 
anag_fasc mam where 
anag.id
=mam.id_anag and mam.id_fasc=
fasc.id
 order by 
fasc.id
;
la order by devi metterla come meglio ti serve.
in questo modo, non hai i valori uniti tutti insieme come con una left join, 
ma, fascicolo per fascicolo, ti devi fetchare solo i risultati che 
effettivamente ci sono.
(concettualmente è lo stesso).
sembra uno svantaggio, in realtà questo ti consente di avere più di tre 
relazioni sullo stesso fascicolo e, in caso di migrazione di db, hai anche 
la possibilità di avere fk not null con qualsiasi numero di relazioni (cosa 
buona secondo le regole di normalizzazione).
a te le riflessioni, magari non è quello che ti serve.
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/philosophy/motivation.it.html

 order by 
fasc.id
;
Questa va benissimo in una relazione uno a uno, cioè nel caso in cui a un
record della tabella fascicoli ne fosse associato uno ed un solo della
tabella anagrafica. Purtroppo, per come è strutturato il db in questo
momento, a ciascun record della tab. fascicoli sono associati fino a tre
record di quella anagrafica, quindi la tabella "di collegamento" potrebbe
avere fino a tre record per ciascun id della tab. fascicolo (
fasc.id
).
E' possibile quindi che serva un'altro tipo di query per ottenere il
risultato sperato (left (outer) join??)...
che in linea di max è il seguente...
anag.campo1.valore1 | anag.campo1.valore2 | anag.campo1.valore3 | 
fasc.id
Un altro approccio consiste nel mantenere le cose così come stanno a livello
di db... Ma ho un problema sulla query...
Quella che mi hai suggerito prima va benone, ma ovviamente se anche solo una
delle tre chiavi esterne della tabella fascicoli è == NULL o a zero, la riga
non viene inclusa nella select, quando invece mi servirebbe averla...
Ecco la query attuale...
select a.ragsoc, b.ragsoc, c.ragsoc, slave.a_id, slave.b_id, slave.c_id from
anagrafiche a, anagrafiche b, anagrafiche c, fascicoli slave
where slave.a_id=
a.id
 and slave.b_id=
b.id
  and slave.c_id=
c.id
Grazie ancora per la disponibilità!
--
L.

 avere fino a tre record per ciascun id della tab. fascicolo (
fasc.id
).
è proprio qui che casca l'asino!!
in questo modo, io posso avere da 0 a infinite associazioni 
fascicolo/anagrafica.
la tabella di giunzione l'ho chiamata mam non a caso (molti a molti).
non devi pensare ad uno sviluppo della tabella orizzontale, ma verticale.
se il tuo problema sta nella rappresentazione, ti basta una fetch per ogni 
associazione e "cambiare riga" solo quando hai il cambio effetivo di 
fascicolo.
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/philosophy/no-word-attachments.it.html