[Risolto] Aggiornamento dinamico con mysql

Salve a tutti,

Spero che il quesito che vi pongo sia coerente con questo forum.

DB MYSQL

Vorrei sapere com’è possibile aggiornare piu righe in base all’id riga, dopo aver estartto i dati da una join. Tutto questo dentro una procedura.

In sostanza la selezione mi restituisce più righe, come faccio in modo dinamico ad aggiornare(update) i campi con i valori restituiti da una query precedente?

e quindi come faccio ad incapsulare in più parametri gli id restituiti che mi servono per l’aggiornamento delle tabelle interessate?

Spero di essere stato chiaro

Non mi è molto chiaro il tuo problema, potresti spiegarci un po’ meglio?

grazie

La domanda è pertinente nella sezione in cui hai inserito questa discussione.
Come straight non capisco la domanda.
Puoi darci la query che usi per interrogare mysql?
Uno schema di db su cui vuoi fare quello che chiedi? Così possiamo venirti incontro.

capisco in effetti è un concetto un po’ contorto,
vi posto uno schema di query fac-simile alla mia

select tab1.* tab2.*

from
db.tab1
db.tab2
db.tab3
db.tab4
db.tab5
db.tab6
db.tab7

where
tab1.campo in (

select tab1.campo

from
db.tab1
db.tab2
db.tab3
db.tab4
db.tab5
db.tab6
db.tab7

where
tab1.campo in (‘1234’,‘12345’)

AND tab1.id=tab2.id
AND …
)
AND …

la query restituisce

id1 campo1 … campo_n
id2 campo2 … campo_m

io dovrei updare campo 1 campo2

tutto questo dentro una procedura e quindi in modo dinamico
cioè sarebbe facile se dovessi modificare solo un campo in quanto lo incapsulerei dentro una variabile, ma come faccio se i campi sono più di uno e non so quanti in realtà sono?

Scusate la mia non chiarezza nello spiegare il problema

Continuo a non avere le idee molto chiare:

id1 campo1 ... campo_n id2 campo2 ... campo_m
Non capisco cosa sia, è una tabella del tipo:

id1 campo1 ... campo_n id2 campo2 ... campo_m

con id1 campo1 … campo_n a partenenti a tabella1
e id2 campo2 … campo_m a partenenti a tabella2

?

Oppure sono due ennuple della tabella risultato?
Perdonami ma la nomenclatura che hai usato mi confonde.

Inoltre puoi chiarirmi che modifiche devi effettuare a campo1 e campo2, c’è un’altra query che discrimina che tipo di modifiche effettuare?

Cerca di spiegarci (o almeno spiegarmi che magari sono io poco sveglio) un po’ più chiaramente.

Continuo pure io a non capire. Vorrei aggiungere queste domande: devi elaborare i dati con un qualche linguaggio (quale?) e inserirli in una nuova tabella?
Devi utilizzare solo linguaggio SQL? Per cui del tipo:

INSERT INTO table_name VALUES (query_che_hai_citato)

Dato che devi aggiornare ti serve il comando SQL UPDATE e quindi:

UPDATE nomeTabella SET nomeCampo=(il nuovo valore che devi inserire), nomeCampo=(altro valore) (e via dicendo con altri campi) WHERE id= (l'id per il quale devi aggiornare il campo)

quello che fa è aggiornare n campi a partenenti ad una sola tabella ed una sola riga della stessa.
Puoi aggiornare più righe dicendo

WHERE (condizioni che vuoi)

ma allora succede che aggiorni con lo stesso valore N righe che soddisfano la condizione. Se tu volessi impostare valori diversi su su righe diverse da tabelle differenti … è un bel casotto, e se non vado errato è possibile solo con TSQL (by Microsoft)

Parlando del tuo esempio:
quello che hai scritto è sbagliato perché tu stai dicendo che il risultato della query ha un solo id ma questo è impossibile perché hai selezionato tutti i campi di due tabelle e quindi devi avere almeno due chiavi primarie come risultato (due id per riga per intenderci).

Tu vorresti aggiornare la seconda voce dell’esito della query ma, detto come l’hai detto, non è specificato a chi a partenga quel campo: tab1 o tab2? Prima di fare un UPDATE devi sapere quale sia la tabella che vuoi aggiornare.

Spero sia più chiaro del tuo esempio :stuck_out_tongue:

[quote]
Se tu volessi impostare valori diversi su su righe diverse da tabelle differenti … è un bel casotto, e se non vado errato è possibile solo con TSQL (by Microsoft)

Parlando del tuo esempio:
quello che hai scritto è sbagliato perché tu stai dicendo che il risultato della query ha un solo id ma questo è impossibile perché hai selezionato tutti i campi di due tabelle e quindi devi avere almeno due chiavi primarie come risultato (due id per riga per intenderci).

Tu vorresti aggiornare la seconda voce dell’esito della query ma, detto come l’hai detto, non è specificato a chi a partenga quel campo: tab1 o tab2? Prima di fare un UPDATE devi sapere quale sia la tabella che vuoi aggiornare.

Spero sia più chiaro del tuo esempio :P[/quote]

Ho detto che ho postato una fac-simile della mia query, da non prendere in considerazione come riferimento tab1 o tab 2 l’ho fatto solo per farvi capire che faccio una select annidata dentro un’alra select.

quello che mi interessa sapere ( nonostante la mia spiegazione, credo che fenomeno abbia capito) è impostare valori diversi su righe diverse

avevo scritto questo risultato id1...campo1...campo_n id2 ..campo2..campo_m

con id1!=id2
a sua volta campo1…ecc non è da interdersi come nome campo ma come valore del campo tabella,
quindi sono due righe diverse,
posso avere come risultato n righe a cui devo aggiornare alcuni campi.

La mia domanda è come posso farlo all’interno di una procedura mysql.

Fenomeno io cmq so quale tabella aggiornare e come farlo con una query secca, in realtà le tabelle da aggiornare sono due.

quindi ripeto il risultato del join

riga1: id1(tab1) valore_campo1(tab1)....id1(tab2)..valorecampo(tab2)...
riga2: id2(tab1) valore_campo2(tab1)....id2(tab2)..valorecampo(tab2)..
rigan: idn(tab1) valore_campon(tab1)....idn(tab2)..valorecampo(tab2)..

In poche parole vorrei aggiornarle tutte massivamente.
Ogni riga con possibili valori diversi.

Scusate se non sono chiaro nello spiegare il mio problema.

La soluzione data non può funzionare?

INSERT INTO table_name VALUES (query_che_hai_citato)

Se non mi confondo dovrebbe andare senza problemi…
Altrimenti prova a vedere qui:
http://dev.mysql.com/doc/refman/5.5/en/flow-control-constructs.html

@MarioS
Con INSERT stai inserendo dati nuovi nel DB, mentre ZEP vuole aggiornare dati esistenti

@ZEP
ahn quindi … vediamo se ho capito tutto:
tu vuoi che tramite una sola stringa SQL aggiorni i campi di due (teoricamente N) righe differenti della stessa tabella usano i dati restituiti da una SELECT annidata nella stessa query che da due (o N) righe di risultato … giusto?
Se è così, con MySQL non penso sia possibile direttamente, mentre mi pare sia possibile con SQL Server di Microsoft con TSQL che permette UPDATE più articolate.

Di sicuro il link proposto da mario riguardo alle procedure di MySQL è valido per fare questo tipo di operazioni, quindi puoi provare a creare qualche ciclo WHILE che faccia ciò che vuoi. Sinceramente non mi è mai capitato di far fare cose così articolate in SQL quindi il risultato pronto all’uso non te lo so dare :slight_smile:

Domanda: è una tua sperimentazione a scopo didattico? O è per un prodotto da realizzare? Se è il secondo caso, che vantaggi pensi di trarre dal delegare tutto a MySQL piuttosto che fare un ciclo dal linguaggio che stai usando?

[quote=fenomeno]
@ZEP
ahn quindi … vediamo se ho capito tutto:
tu vuoi che tramite una sola stringa SQL aggiorni i campi di due (teoricamente N) righe differenti **della stessa tabella usando i dati restituiti da una SELECT annidata **nella stessa query che da due (o N) righe di risultato … giusto?
Se è così, con MySQL non penso sia possibile direttamente, mentre mi pare sia possibile con SQL Server di Microsoft con TSQL che permette UPDATE più articolate.

Domanda: è una tua sperimentazione a scopo didattico? O è per un prodotto da realizzare? Se è il secondo caso, che vantaggi pensi di trarre dal delegare tutto a MySQL piuttosto che fare un ciclo dal linguaggio che stai usando?[/quote]

Fuochino @fenomeno,righe differenti non della stessa tabella ma di due tabelle usando gli n dati restituiti non dalla select annidata ma da una query che faccio precedentemente, la ormai famosa query interna la uso come condizione per la restituzione delle righe interessate per la modofica.

Una query mi dice i valori" nuovi" che dovrei prendere e usare per un’altra seconda query che mi dice dove andarli a sostituire a quelli “vecchi”

Il tutto dentro una procedura

LO SO è un casino, già capire quello che voglio dire è un impresa, e vi ringrazio per questo, all’inizio sono stato “forse :)” un po’ troppo sintetico.

Se risolvo(ho i miei dubbi) vi farò felicemente sapere

@fenomeno
Per la tua seconda domanda, non uso nesseun linguaggio, purtroppo questa è una strada obbligata.

Allora, supponiamo di avere:
Tabella1 e Tabella2, Tabella1 è la tabella che contiene i dati da modificare con i dati contenuti in Tabella2.
Dovendo modificare i dati in Tabella1 con dati in Tabella2 ed eventualmente fare altre operazioni io utilizzerei i http://dev.mysql.com/doc/refman/5.0/en/cursors.htmlcursori.
Un cursore ti permette di scorrere ennupla per ennupla una tabella se utilizzato insieme ad un loop (come ti ha suggerito MarioS).

Le primitive per i cursor sono:

DECLARE nomecursore CURSOR FOR sottoselect;

che ti dichiara un cursore per sottoselect.
Prima di utilizzarlo il cursore va aperto, l’apertura genera effettivamente il risultato di sottoselect:

OPEN nomecursore;

A questo punto puoi caricare in una serie di variabili locali alla funzione/procedura i campi della prima ennupla non ancora letta della tabella:

DECLARE campo1 tipo1; ... DECLARE campon tipon; FETCH nomecursore INTO campo1, ..., campon;

Comunque ci sono ulteriori dettagli nella documentazione che ti ho linkato.

Ora potresti usare il cursore per scorrere Tabella1, con una select su Tabella2 carichi i valori con cui aggiornare la ennupla caricata in campo1, …, campon e poi con una update ti vai a modificare effettivamente la ennupla in Tabella1.

Spero sia chiaro e spero c’entri qualcosa con il tuo problema:-)

Ciao , se non capito male il tuo post ti serve una query con questa sintassi che ho copiato spudoratamente da internet :slight_smile:

UPDATE tabella
SET campo = ( SELECT campo
FROM tabella
WHERE primary_key = valore)
WHERE EXISTS
( SELECT campo
FROM Tabella
WHERE primary_key = valore);

l’unico problema e che spesso questi statement sono fragili rischi che ti dia un errore , se non si identificano correttamente gli insiemi della prima select con la seconda , conta che i risultati del update e della select devono essere identici.

Ciao

Ciao a tutti,

scusate il ritardo,

Alla fine ho risolto con un trigger, per adesso funziona tutto, anche se le query rimangono quelle che ho scritto in precedenza, con la differenza che mi metto i risultati delle query in più variabili che poi uso come condizione per l’UPDATE.

[code]
SELECT CAMPO INTO VARIABILE FROM TAB1
WHERE …

UPDATE TAB2 SET CAMPO=NEW_VAL WHERE ID=VARIABILE Dove VARIABILE è il valore che faccio ritornare dalla query[/code]

Creando un trigger dopo tutti i controlli necessari fa l’update per la riga interessata.

Grazie a tutti, e mi scuso per la confusione creata.