Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 38

Hybrid View

  1. #1
    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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:
    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
    il campo cognome a che tabella fa riferimnto?

    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Ok mi pare una giusta osservazione.
    Eccola sotto.

    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=
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    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

    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Si, non funge, fa quel lavoro che ti ho fatto vedere sopra, incrociando i vari versamenti in diverse righe di risultato. Prodotto cartesiano.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.