1

ここで私がやろうとしているのは、$ doneで識別されるテーブルtodoのレコードの列recurintervalに値がある場合、date_scheduled列をリセットします。ELSEはそれらのレコードのstatus_id列を6に設定します。

これは私がmysql_error()から得るエラーです...

SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、2行目の「CASErecurinterval!= 0 AND recurinterval IS NOT NULLTHENSETdate_sche」の近くで使用する正しい構文を確認してください。

このステートメントを機能させるにはどうすればよいですか?

UPDATE todo 
CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
ELSE 
SET status_id = 6 WHERE todo_id IN ($done)
END

次のmySQLステートメントは、上記のように修正する前は問題なく機能していました。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL
4

3 に答える 3

1

問題は、1つのクエリだけではafaikでは不可能なことをしようとしているということです。recurintervalフィールドの値に基づいて、2つの列のうちの1つを更新します。したがって、基本的には2つのクエリに分割する必要があります。最初のクエリは、つまり、持っていたクエリになります。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL

そして2番目のものは他の行用になります:

UPDATE todo 
SET status_id = 6
WHERE todo_id IN ($done) 
AND (recurinterval = 0 
OR recurinterval IS NULL)

これらのクエリを実行する場合(クエリの1つでエラーが発生した場合に変更をロールバックできるように、トランザクション内で実行することをお勧めします)、目的の結果が得られるはずです。

于 2010-03-29T07:17:00.983 に答える
0

最初のCASEキーワードの後に​​「WHEN」を追加する必要があると思います。したがって、最初の行の先頭は次のようになります。

UPDATE todo CASE WHEN recurinterval !=0 AND ...
于 2010-03-29T07:15:42.383 に答える
0

変更されたステートメントの最初のケースは、CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN実際にはIF

于 2010-03-29T18:48:37.637 に答える