0

LoationName= $locationName である次のテーブルを更新するために使用されるフォームがあります

+--------+---------------------+--------------+------+
|Id |LocationName|TaskComplete | TaskNotes           |
+--------+---------------------+--------------+------+
|001| NYC,FRA,UK |no,yes,no    |NULL,Task Completed-FRA,NULL
|002| NYC,FRA,UK |no,no,yes    |NULL,NULL,task-completed @ UK
|003| NYC,FRA,UK |no,no,yes    |NULL,Task-started-FRA,completed Mar 3rd

task-complete および task-notes 列を正しい locationName に対応する情報で更新するにはどうすればよいですか? NYC がステータスを更新する場合、テーブルは次のように更新する必要があります。

+--------+---------------------+--------------+------+
|Id |LocationName|TaskComplete | TaskNotes           |
+--------+---------------------+--------------+------+
|001| NYC,FRA,UK |yes,yes,no   |NYC NOTES,Task Completed-FRA,NULL
|002| NYC,FRA,UK |yes,no,yes   |NYC-Finished task2,NULL,task-completed @ UK
|003| NYC,FRA,UK |yes,no,yes   |Completed-Tuesday,Task-started(FRA),completed Mar 3rd

25 か所で完了する必要がある合計 100 のタスクがあります。次の UPDATE ステートメントは問題ありませんが、col を単一の値 ("yes" または "no") で更新するだけなので、このシナリオでは機能しません。

UPDATE operations_checklist SET TaskComplete='$val' where TaskId IN($i)

私の解決策は、TaskComplete 値を爆発させ、array_replace を使用して必要な値/位置を更新することだと考えています。最善の解決策は何ですか?

TaskName に 77 列、TaskNotes に 77 列、completeDate に 77 列などのテーブルを作成することになるかもしれません。

4

1 に答える 1

1

MySQLにはSPLIT関数が組み込まれていないため、このアクションにクエリを使用することは受け入れられません。FUNCTIONを自分で作成するか、そのようなアクションに組み込み関数を使用するための長い価値のないアルゴリズムを作成する必要があります...

あなたが自分で言ったように、これにphpを使用してデータを分解し、必要なものを置き換えてから、内破してレコードを更新することを強くお勧めします...

更新 テーブル構造についてのメモです。現在の構造の代わりにこれを行うことができます。

この構造を持つ 2 番目のテーブルを作成します。

+----+----------+------------+
| FK | TaskType | TaskStatus |
+----+----------+------------+
| 1  | 1        | True
| 1  | 2        | False
| 2  | 1        | False

このテーブルは FK を介してメイン テーブルにリンクされ、フィールドで ~70 個のカンマを使用する代わりに、このフィールドで TaskType 1、2、...、70 を使用し、TaskStatus を true または false に設定して yes と no を指定します。 FK の TaskType がない場合も、ここで no を意味します ...

于 2012-09-16T17:52:47.890 に答える