consiglio un ripassino sulla sintassi del JOIN :
http://www.html.it/pag/32151/luso-delle-join/
consiglio un ripassino sulla sintassi del JOIN :
http://www.html.it/pag/32151/luso-delle-join/
Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
Albert Einstein
Siate Affamati, siate Folli, siate Onesti e siate Generosi
Allora, ho rimosso i sum e aggiunto alcune colonne per capire cosa succede.
SELECTcognome,nome,quotaAStotale_quote_associative ,importoAStotale_quote_div,cifraAStotale_versament i,quote_associative.anagrafica_id,quote_associativ e.id
FROManammi.anagrafica
LEFTJOINanammi.quote_associativeONquote_associativ e.anagrafica_id=anagrafica.id
LEFTJOINanammi.quote_diverseONquote_diverse.anagra fica_id=anagrafica.id
LEFTJOINanammi.quote_versateONquote_versate.anagra fica_id=anagrafica.id
WHEREanagrafica.id=1
il risultato è:
Tizio Caio 200 2 200 1 1
Tizio Caio 200 2 300 1 1
Tizio Caio 200 2 200 1 1
Tizio Caio 200 2 300 1 1
Tizio Caio 200 2 200 1 2
Tizio Caio 200 2 300 1 2
Tizio Caio 200 2 200 1 2
Tizio Caio 200 2 300 1 2
Tizio Caio 223 2 200 1 3
Tizio Caio 223 2 300 1 3
Tizio Caio 223 2 200 1 3
Tizio Caio 223 2 300 1 3
in pratica fa effettivamente un prodotto cartesiano dei vari result incrociando i risultati. Probabilmente ho un certo limite cosciente nell'utilizzo dei comandi SQL, ma ho la quasi certezza che cambiando i LEFT JOIN con qualcos'altro che in questo momento ignoro, questa situazione si corregge in un attimo.
Ultima modifica di Korenaar; 13-05-2014 a 16:03
ciao,
a me (su questo forum) hanno insegnato a scrivere le query quanto più leggibili possibili. Questa è una cosa importantissima e fondamentale, tanto che semplifica la vita anche a chi ti vuole aiutare.
per piacere spiega la tua query:
il campo cognome a che tabella fa riferimnto?codice:SELECT cognome, nome, quotaAStotale_quote_associative , importoAStotale_quote_div, cifraAStotale_versament i, quote_associative.anagrafica_id, quote_associativ e.id FROM anammi.anagrafica LEFTJOINanammi.quote_associativeONquote_associativ e.anagrafica_id=anagrafica.id LEFTJOINanammi.quote_diverseONquote_diverse.anagra fica_id=anagrafica.id LEFTJOINanammi.quote_versateONquote_versate.anagra fica_id=anagrafica.id WHERE anagrafica.id=1
credo che faccia riferimento a anammi.anagrafica
nella clausola WHERE il campo anagrafica.id a quale tabella dovrebbe fare riferimento?
iniizia a correggere queste cose! io la scriverei cosi:
codice:SELECT nometabella.cognome, nometabella.nome, nometabella.quotaAStotale_quote_associative , nometabella.importoAStotale_quote_div, nometabella.cifraAStotale_versament i, nometabella.quote_associative.anagrafica_id, nometabella.quote_associativ e.id FROM anammi.anagrafica LEFTJOINanammi.quote_associativeONquote_associativ e.anagrafica_id=anagrafica.id LEFTJOINanammi.quote_diverseONquote_diverse.anagra fica_id=anagrafica.id LEFTJOINanammi.quote_versateONquote_versate.anagra fica_id=anagrafica.id WHERE nometabella.anagrafica.id=1
Ok mi pare una giusta osservazione.
Eccola sotto.
Purtroppo sto facendo 10 cose insieme, ho letto il link sulle join consigliato sopra (che non avevo visto prima del mio precedente post, chiedo venia), credo di aver capito che devo prima fare il JOIN (tra parentesi) delle tabelle collegate e solo dopo impostare la JOIN con la tabella principale. Almeno questo è quello che mi pare di aver capito, tra un pò magari provo a rigirare di nuovo la query.Codice PHP:SELECT
anagrafica.cognome,
anagrafica.nome,
quote_associative.quota AS totale_quote_associative,
quote_div.importo AS totale_quote_div,
versamenti.cifra AS totale_versamenti,
quote_associative.anagrafica_id,
quote_associative.id
FROM
anammi.anagrafica
JOIN anammi.quote_associative ON quote_associative.anagrafica_id = anagrafica.id
JOIN anammi.quote_diverse ON quote_diverse.anagrafica_id = anagrafica.id
JOIN anammi.quote_versate ON quote_versate.anagrafica_id = anagrafica.id
WHERE anagrafica.id=1
credo che sia un errore...
tu vuoi selezionare record dalla tabella 'anammi.anagrafica' e metti una condizione sulla tabella 'anagrafica' WHERE anagrafica.id=1
penso sia sbagliata come logica.
poi, se tu postassi la struttura delle tabelle in questione ci faciliteresti l'help
prova cosi:
codice:SELECT anagrafica.cognome, anagrafica.nome, quote_associative.quota AS totale_quote_associative, quote_div.importo AS totale_quote_div, versamenti.cifra AS totale_versamenti, quote_associative.anagrafica_id, quote_associative.id FROM anagrafica JOIN anammi.quote_associative ON quote_associative.anagrafica_id = anagrafica.id JOIN anammi.quote_diverse ON quote_diverse.anagrafica_id = anagrafica.id JOIN anammi.quote_versate ON quote_versate.anagrafica_id = anagrafica.id WHERE anagrafica.id=1
Ultima modifica di 123delphi321; 13-05-2014 a 16:51
La struttura è
anagrafica (tabella main)
Queste tre tabelle riportano ciascuna i loro totali, legati per id alla tabella main.
quote_associative (con FK anagrafica.id)
quote_diverse (con FK anagrafica.id)
quote_versate (con FK anagrafica.id)
In sostanza lo scopo è ottenere un set di risultati (in base ai criteri impostati da utente, ma su questo sono a posto) che riportino in una linea:
- il cognome, il nome e vari altri dati anagrafici ininfluenti (cambia solo il select su tabella)
- il risultato di (quote_associative + quote_diverse - quote_versate) da calcolare successivamente alla pesca corretta dei dati mediante apposita funzione php.
Ho pochi dati di test dentro e dunque mi sono reso conto subito che i totali sono sballati. Da qui la richiesta di aiuto dato che dopo vari test non ho trovato dov'è l'errore logico.
hai provato la query che ti ho corretto?
codice:SELECT anagrafica.id, anagrafica.cognome, anagrafica.nome, quote_associative.quota AS totale_quote_associative, quote_div.importo AS totale_quote_div, versamenti.cifra AS totale_versamenti, quote_associative.anagrafica_id, quote_associative.id FROM anagrafica JOIN anammi.quote_associative ON quote_associative.anagrafica_id = anagrafica.id JOIN anammi.quote_diverse ON quote_diverse.anagrafica_id = anagrafica.id JOIN anammi.quote_versate ON quote_versate.anagrafica_id = anagrafica.id WHERE anagrafica.id=1
Si, non funge, fa quel lavoro che ti ho fatto vedere sopra, incrociando i vari versamenti in diverse righe di risultato. Prodotto cartesiano.
tu hai provato questa query e ottieni un dataresoult?
spiegami cosa e': versamenti.cifra ?????
invece di utilizzare join usa left join
codice:SELECT anagrafica.id, anagrafica.cognome, anagrafica.nome, quote_associative.quota AS totale_quote_associative, quote_div.importo AS totale_quote_div, versamenti.cifra AS totale_versamenti, quote_associative.anagrafica_id, quote_associative.id FROM anagrafica left JOIN anammi.quote_associative ON quote_associative.anagrafica_id = anagrafica.id left JOIN anammi.quote_diverse ON quote_diverse.anagrafica_id = anagrafica.id left JOIN anammi.quote_versate ON quote_versate.anagrafica_id = anagrafica.id WHERE anagrafica.id=1
Delphi, inizio ringraziandoti per il tempo che mi stai dedicando e per le volte che stai rispondendo. Ti stai fossilizzando un pò troppo su questa o quella colonna, a me interessa la logica e un indirizzamento, quel versamenti.cifra è quote_versate.cifra, un refuso derivante dal rimaneggiamento della query di cui mi ero già accorto tentando di far girare la query stessa.
Stringo il concetto a livello assoluto, poi me la vedo io con i termini o non ne usciamo più:
tabella main
tab1 |
tab2 | - tutte collegate tramite FK a main
tab3 |
come la faccio una join totale? con left join no evidentemente.
Questa query qui sopra che tu posti da il risultato nell'immagine allegata sotto, che è il classico incrocio cartesiano. Se vedi la colonna id di destra, che rappresenta quote_associative.id, si ripete 4 volte per record.
query.jpg
Ultima modifica di Korenaar; 14-05-2014 a 12:57