-3

tbl_scripts次のようなテーブルがあります。

 allowed_group_ids
+-----------------+
 12343,12343,21342

そして、この文字列からグループ ID (12343 など) を削除する必要がありdelete_group_idます12343

UPDATE tbl_scripts
SET allowed_group_ids = 
  REPLACE(
    REPLACE(allowed_group_ids, '$delete_group_id,', ''),
    ',$delete_group_id', '')
WHERE
  system_id = {$_SESSION['system_id']}

ただし、列に単一の値しかない場合は失敗します。

 allowed_group_ids
+-----------------+
 12343 <-----I'm not able to replace this with blank

テーブルを正規化する必要があることはわかっていますが、現時点ではデータベース構造を変更できないため、この方法で機能させようとしています。クエリを単一の値で機能させるにはどうすればよいですか?

4

4 に答える 4

0

最初の置換は末尾のコンマを検索し、2 番目は先頭のコンマを検索します。単一のグループ ID には、末尾のコンマがありません。

最も安全なオプションは、フィールド = 値の場合に 2 番目のクエリを実行することです。

任意の時点でこれを行う

REPLACE(allowed_group_ids, '$delete_group_id', '')

長い ID の一部を削除する可能性があります (たとえば、1234567 のうち 123456 は 7 のままになります)。

または、単一の ID の場合でも常に末尾のコンマを追加すると、次のようなものだけが必要になります

REPLACE(allowed_group_ids, '$delete_group_id,', '')

末尾のコンマを追加すると、データベース全体で簡単に更新できます (1 回限りのクエリとして)。

UPDATE table SET allowed_group_ids = CONCAT(allowed_group_ids, ',');

次に、このテーブルで動作する挿入および更新ステートメントのコードを確認します

于 2013-01-16T11:53:15.547 に答える
0

これを試して:

UPDATE tbl_scripts SET allowed_group_ids = 
TRIM(BOTH ',' FROM REPLACE(allowed_group_ids, '$delete_group_id', ''))
WHERE system_id = {$_SESSION['system_id']}

これにより、すべてのエントリが削除さ$delete_group_idれ、関数で前後のコンマがクリーンアップされTRIMます。

于 2013-01-16T11:53:25.430 に答える
0

これを試してみてください。これが構文的にどれだけ実現可能かはわかりません..

UPDATE tbl_scripts SET allowed_group_ids = 
CASE WHEN INSTR(allowed_group_ids, '$delete_group_id,') > 0 THEN
REPLACE(REPLACE(allowed_group_ids, '$delete_group_id,', ''), ',$delete_group_id', '')
ELSE NULL END
WHERE system_id = {$_SESSION['system_id']}
;


UPDATE tbl_scripts SET allowed_group_ids = 
CASE WHEN INSTR(allowed_group_ids, ',') > 0 THEN
REPLACE(REPLACE(allowed_group_ids + ',', '$delete_group_id,', ''), ',$delete_group_id', ''
ELSE
REPLACE(REPLACE(allowed_group_ids, '$delete_group_id,', ''), ',$delete_group_id', '')
END
AND system_id = {$_SESSION['system_id']}
;
于 2013-01-16T11:53:30.630 に答える
0

これはあなたが探していることを行うべきだと思います:

UPDATE tbl_scripts
SET allowed_group_ids =
  TRIM( both ',' from
  REPLACE(
    REPLACE(
      CONCAT(',',
        REPLACE(allowed_group_ids, ',', ',,')
           , ','), ',12343,', '')
    , ',,', ','))
  • 最初に私はすべてを2倍に,します,,
  • 次に、削除するグループを一致させやすくするために,、文字列の前と後に a を追加します,
  • ,delete_group_id,次に、すべて(先頭と末尾のカンマを含む) を空の文字列に置き換えます
  • それから私は再びすべて,,をシングルに戻します,
  • TRIMを使用して、先頭と末尾を削除します,
于 2013-01-16T12:10:07.240 に答える