Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472

    [mysql] Aggiornare (update) 2 diverse tabelle

    Spero di riuscire a spiegarmi...sarà l'ora tarda...ma ho un dubbio...

    Semplificando la cosa faccio direttamente l'esempio.

    Tabella tab_a
    id - password - email - quota (contiene questi 4 campi con id chiave primaria) e tanto per esemplificare poniamo che sia così popolata:
    1 - 123 - pippo@emai.it - 700
    2 - 214 - mario@email.it - 600
    3 - 444 - rino@tiscali.it - 400
    4 - 345 - lara@tiscali.it - 800

    Tabella tab_b
    id1 - riga - scelta - relativoid - paga - stato (contiene questi 5 campi con id1 chiave primaria mentre relativoid si riferisce all'id di tab_a):
    e poniamo sia così popolata
    1 - 1 - 1 - 1 - 100 - 0
    2 - 1 - 2 - 1 - 150 - 0
    3 - 2 - 1 - 2 - 100 - 0
    4 - 1 - 1 - 2 - 180 - 0
    5 - 1 - 2 - 3 - 100 - 0
    6 - 1 - 1 - 3 - 50 - 0

    La modifica che dovrei fare è questa: portare a 1 la variabile booleana stato quando "riga" assume un determinato valore e "scelta" pure...:
    UPDATE tab_b SET stato='1' WHERE riga='1' and scelta='1'
    e quindi le righe interessate al cambio (nell'esempio sarebbero 3: la 1 la 4 e la 6).

    Però contemporaneamente vorrei anche che nella tab_a si agisse tante volte quante sono le modifiche che ho fatto in tab_b e in particolare si andasse a incrementare "quota" del valore di "paga" quando l'id corrisponde a "relativoid".
    Mi spiego meglio continuando l'esempio: il file tab_a dovrebbe essere modificato
    - la riga 1 ha come "relativoid" il numero 1 e quindi in tab_a il "fondo" dell'id=1 dovrebbe diventare 700+100=800
    - la riga 4 ha come "relativoid" il numero 2 e quindi in tab_a il "fondo" dell'id=2 dovrebbe diventare 600+180=780
    - la riga 6 ha come "relativoid" il numero 3 e quindi in tab_a il "fondo" dell'id=3 dovrebbe diventare 400+50=450

    Naturalmente niente vieta che possa esserci un 7° file in tab_b dove figuri ancora una volta riga=1, scelta=1 e un relativoid già trovato in precedenza.

    Spero di essere stato sufficientemente chiaro anche se mi rendo conto che a prima vista la cosa può sembrare un po' ingarbugliata.

    Il fatto è che se prima faccio la query come quella dell'esempio vengono cambiate tutte le righe che soddisfano quelle condizioni ma io per ogni singola riga devo poi operare il cambiamento anche sulla tabella tab_a

    Devo usare join? Devo impostare le query in modo diverso?

    La prima cosa che mi è venuta in mente è stata di agire con SELECT e scandagliare tutto tab_b e a mano a mano che trovo un file che soddisfa i requisiti modificare quello e andare a fare la modifica su tab_b però non l'ho provato perché mi sembra troppo macchinoso...e mi chiedevo se c'era qualcosa di più veloce...

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Prova....

    update tab_a a join tab_b b on (a.id = b.relativoid) set b.stato = '1', a.quota = a.quota + b.paga where b.riga = '1' and b.scelta = '1'


    P.S. This sql statement comes with NO WARRANTY at all
    In italiano: fatti un backup delle tabelle prima

  3. #3
    update multitabella. si dovrebbe poter fare...

    codice:
    update taba, tabb
    set
    taba.quota = taba.quota + tabb.paga,
    tabb.stato = 1
    where
    taba.id = tabb.relativo_id
    and tabb.riga = 1 
    and tabb.scelta = 1
    vedi se funziona... pero' mi chiedo: ammettiamo che si debba fare solo se stato = 0 e non riconteggiare se stato = 1 .... dovrai aggiungere una AND in WHERE (of course).

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Originariamente inviato da luca200
    P.S. This sql statement comes with NO WARRANTY at all
    In italiano: fatti un backup delle tabelle prima
    fortemente sottinteso......

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Ho optato per il metodo suggerito da Piero.mac.

    C'è una cosa che non va.


    Quando ricorrono 2 volte (o più) "riga" e "scelta" per lo stesso "id" c'è un problema nella "quota" della tab_a infatti aggiorna solo la prima volta! Le volte successive non somma più.

    Puoi aiutarmi Piero? Grazie!

  6. #6
    guarda che le due query sono identiche. Sono due forme diverse, ma identiche nella sostanza.

    Purtroppo non puoi aggiornare due volte lo stesso campo con un update. E non puoi neanche fare un raggruppamento su una tabella che viene aggiornata. Almeno per quanto ne so. Magari Luca ne sapra' certamente piu' di me.

    Devi fare due query magari usando una variabile per non star ad estrarre i dati...

    un esempio:

    codice:
    set @a = (select sum(tabb.paga)
    from taba, tabb 
    where tabb.riga = 1
    and tabb.scelta = 1
    and taba.id = tabb.relativo_id);
    
    update taba, tabb
    set
    taba.quota = taba.quota + @a,
    tabb.stato = 1
    where
    taba.id = tabb.relativo_id
    and tabb.riga = 1 
    and tabb.scelta = 1;
    in pratica raccogli il totale nella variabile @a e poi sommi quello. Dovrebbe andare.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    In questo modo fa una somma unica (@a) di quanto è variato complessivamente il campo "quota" e poi lo somma a tutti gli utenti.

    In pratica se per l'utente 1 quota dovrebbe passare da 700 a 800
    per l'utente 2 da 600 a 900
    per l'utente 3 da 400 a 500
    per l'utente 4 da 800 a 1000

    fa 100+300+100+200=700

    e poi le nuove "quota" sono:
    700+700=1400 per l'1
    600+700=1300 per il 2
    400+700=1100 per il 3
    800+700=1500 per il 4

    grazie Piero!

  8. #8
    epsss.... non sono sicuro faccia quello che dici..... la variabile viene eseguita una sola volta.

    provala per bene..... ma mi sa di no. Se avessi le due tabelle potre fare qualche prova. Ma dubito fortemente di no ....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Ho anche controllato ho fatto come mi hai detto tu...
    come avrai visto sono alle prime armi con mysql e php però io vedo che nella variabile @a ci mette "paga" tutte le volte che l'id corrisponde e che la riga=1 e che la scelta=1.

    Esemplifichiamo:
    la tabb è così popolata (id-riga-scelta-relativoid-paga-stato):
    1 - 1 - 1 - 1 - 100 - 0
    2 - 1 - 2 - 1 - 150 - 0
    3 - 2 - 1 - 2 - 100 - 0
    4 - 1 - 1 - 2 - 180 - 0
    5 - 1 - 2 - 3 - 100 - 0
    6 - 1 - 1 - 3 - 50 - 0


    quando trova id=1, lo where è rispettato (il relativoid è 1) e quindi @a vale 100
    quando trova id=2, lo where non è rispettato
    quando trova id=3, lo where non è rispettato
    quando trova id=4, lo where è rispettato (qua il relativoid è 2)e quindi @a vale 100+180=280
    quando trova id=5, lo where non è rispettato
    quando trova id=6, lo where è rispettato (qua il relativoid è 3) e quindi @a vale 280+5o=330

    E' vero che la variabile viene eseguita una sola volta però a quanto vedo io prende tutto!

    E' possibile mettere la variabile @a come array in modo che sia incrementata quella @a[id] e poi quando vado a sommare ci sommo quella...?

  10. #10
    ci vuole una tabella temporanea dove raggruppare i risultati. Vediamo:

    codice:
    create temporary table temp
    select taba.id, sum(tabb.paga) as tot
    from taba, tabb
    where tabb.riga = 1
    and tabb.scelta = 1
    and taba.id = tabb.relativo_id
    group by tabb.relativo_id;
    
    
    update taba, tabb, temp
    set
    taba.quota = taba.quota + temp.tot,
    tabb.stato = 1
    where
    taba.id = tabb.relativo_id
    and taba.id = temp.id
    and tabb.riga = 1 
    and tabb.scelta = 1;
    prova cosi' che dovremmo esserci..... prima non avevo afferrato il discorso dei molteplici id. Mi ero fissato su uno solo...... LA query se la provi da phpmyadmin o altro tool deve essere nella stessa finestra di query.... come la variabile d'altronde. Verifica i nomi dei campi ...

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.