0

これは MySQL テーブル構造です。

表:製品

|----------------------------------------------|
|   id    |             product_ids            |
|   1     |              51                    |
|   2     |              616,2,38              |
|   3     |              (NULL)                |
|   4     |              426,605,604           |
|----------------------------------------------|

私が探しているのは、コードがID 605がproduct_ids行に存在するかどうかを確認し、存在する場合は別のIDに置き換える方法です:

どうすればこれを達成できますか?

私はSQLクエリを考えていました...

4

5 に答える 5

1
while ($row1 = mysql_fetch_array($r1, MYSQL_ASSOC)) {   

    if($row1['product_ids']){
      $val_changed = false;
      $prod_ids = $row1['product_ids'];
      $ids = explode(',', $prod_ids);
      for($i = 0; $i < count($ids); $i++) {
        if($ids[$i] === '605') {
          $ids[$i] = $new_id;
          $val_changed = true;
        }
      }

      if($val_changed) {
        $prod_ids = implode(',', $ids);
        //update db with new value $prod_ids
      }
    }
}

探している ID を持つレコードのみを取得し、preg_replaceを使用して値を変更し、新しい値でテーブルを更新するには

$new_id = '999';
$new_val = preg_replace('/,605,/', $new_id, $row1['product_ids']);
于 2013-09-18T21:43:25.260 に答える
1

これは非正規化問題に最適なhttp://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-setです

于 2013-09-18T21:50:58.400 に答える
0

「605」が含まれているかどうかを確認するには:

SELECT id, product_ids FROM products 
where product_ids REGEXP '^.*[^\d]605(?!\d).*$'

コメント: ところで、これは同じフィールドで複数の値を使用してはいけない理由の非常に良い例です!

いったんそれを手に入れたら、やりたいことが何でもできるし、それで遊ぶことができます:

$new_product_ids = preg_replace('/^(.*[^\d])(605)(?!\d)(.*)$/','${1}new_id${3}',$row1['product_ids']);

行を更新します。

update products set product_ids = '$new_product_ids' where id = $id
于 2013-09-18T21:42:01.907 に答える