2011-12-05 15 views
12

Sono di fronte a una situazione complessa di query SQL. L'attività consiste nell'aggiornare più righe, con più valori e più condizioni. Di seguito sono riportati i dati che voglio aggiornare; campo per aggiornare: 'vendite', campi di condizione: 'campid' e 'data':Aggiornamento di più righe con più valori e condizioni multiple mysql

if campid = 259 and date = 22/6/2011 then set sales = $200 
else if campid = 259 and date = 21/6/2011 then set sales = $210 
else if campid = 260 and date = 22/6/2011 then set sales = $140 
else if campid = 260 and date = 21/6/2011 then set sales = $150 

voglio aggiornare tutti questi in una query.

+0

votato per contrastare downvote senza commenti. Penso che questa sia una domanda legittima se qualcuno non ha ancora conoscenza delle transazioni. –

risposta

19

Prova questo:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200 
    WHEN campid = 259 AND date = 21/6/2011 THEN 210 
    WHEN campid = 259 AND date = 22/6/2011 THEN 140 
    WHEN campid = 259 AND date = 21/6/2011 THEN 150 
    ELSE sales 
END 

Naturalmente non lo faccio sapere se il campo data è realmente DATE o DATETIME, quindi ho lasciato la query che mostra cosa puoi fare, ma forse devi correggere il confronto delle date in base al tipo di dati. Se il campo data è DATE (come dovrebbe), è possibile scrivere AND date = '2011-06-22' e così via.
Nota: ELSE condizione: è necessario evitare che i record che non rientrano negli altri casi siano impostati su NULL.

+0

Grazie Marco. –

+0

Ho usato questo esempio nel mio problema, ha funzionato. Dopo un lungo periodo, sono giunto alla conclusione che questo tipo di query offre le migliori prestazioni su una piccola quantità di dati. Nel caso in cui la tabella abbia milioni di record, quindi l'aggiornamento di un singolo record alla volta utilizzando il parametro chiave primaria, consente di risparmiare un sacco di tempo, quindi produce prestazioni migliori. –

+0

Grazie, ho salvato la notte –

1

Non dovresti farlo in una singola query. Invece, se quello che si mira è di aggiornarli atomicamente, tutti allo stesso tempo, è necessario emettere diverse dichiarazioni UPDATE in una singola transazione .

Non si specifica quale versione di MySQL si utilizza e non quale motore di archiviazione. Supponendo InnoDB - che è lo standard nelle versioni recenti di MySQL e dovrebbe essere generalmente utilizzato per i sistemi transazionali - e anche supponendo che si sta facendo questo dal client a riga di comando, si farebbe

mysql> set autocommit=0; 
mysql> UPDATE ....; 
mysql> UPDATE ....; 
mysql> ... 
mysql> commit; 

È quindi possibile riattivare autocommit se come ripetendo la prima linea, ma con un valore di 1:

mysql> set autocommit=1; 
+0

imo, che non risponde a ciò che chiede OP – ajreal

+0

Sono umilmente in disaccordo. Il costrutto If-elseif-elseif, presentato nella domanda, insieme alla dichiarazione che vuole aggiornare i campi tutti allo stesso tempo, è esattamente ciò che farebbe la mia risposta. Naturalmente, ci sono altri modi per farlo anche se una dichiarazione è veramente (!) Necessaria. –

+0

Daniel è corretto. Stavo chiedendo condizioni multiple per una certa esecuzione. –

1

Piuttosto che scrivere una query sql che è troppo complicata e richiede tempo, credo che sarebbe meglio passare il tempo a scrivere un oggetto di accesso ai dati per gestire queste semplici manipolazioni su base record. Questo rende più tardi la manutenzione del codice, insieme allo sviluppo di un nuovo codice usando i tuoi oggetti di accesso ai dati molto più semplice di un singolo utilizzo, una query sql complessa.