0

次のように、MySQL エントリ 'id_user' にコンマ区切りの数字のリストがあります。

127,130,150,12,4,7,8,9

このコンマ区切りのリストで数字を見つけ、(1) 他の数字が含まれている場合はコンマで削除するか、(2) 数字自体が次のような場合は自分自身を削除する最良の方法は何ですか?

127

次に、MySQL エントリを更新します。

したがって、リストから 150 を削除したい場合は、MySQL で次のように更新されます。

127,130,12,4,7,8,9

ID '12' を削除しようとするのは避けたいのですが、127 や 512 などの数字の '12' を削除してしまいます

ありがとうございました!

4

4 に答える 4

4

行間を読むと、多対多の関係を表すために外部キーのリストをコンマ区切りの文字列フィールドに格納しているように思えます。これは良い考えではありません。

代わりにすべきことは、リレーションを格納するテーブルを作成することです。

たとえば、 という名前のテーブルがあり、usersそれらの間の友人関係を保存したいとします。あなたがしていることは次のようなものです(注:最後に書いたので、これは実際には良い例ではないことに気付きましたが、今のところそれに固執しています):

  id  |  name  |  friends
------+--------+-----------
  1   | Dave   |  2,4
  2   | Bob    |  1
  3   | Tom    |  4
  4   | Bill   |  1,3

一方、行う方がはるかに優れているのは、次のようなものです。

users

  id  |  name  
------+--------
  1   | Dave   
  2   | Bob   
  3   | Tom    
  4   | Bill   

friends

  id  |  user  |  friend
------+--------+----------
  1   |   1    |    2
  2   |   1    |    4
  3   |   2    |    1
  4   |   3    |    4
  5   |   4    |    1
  6   |   4    |    3

あなたができるデイブの友達を選択するには

SELECT u.*
FROM friends f
JOIN users u ON u.id = f.friend
WHERE f.user = 1

...そして Dave と Bob の間の関係を削除するには (ここでやりたいこと)、次のようにします。

DELETE FROM friends
WHERE (
  user = 1 AND friend = 2
) OR (
  user = 2 AND friend = 1
)
于 2012-06-11T18:14:56.390 に答える
1

PHP の使用:

$array = explode(',', $string);
$pos = array_search('127', $array);
unset($array[$pos]);
$string = implode(',', $array);

または MySQL を使用します。

REPLACE(column, '127,', '')
REGEX_REPLACE(column, '127$', '')

UDF REGEX_REPLACE を取得 - https://launchpad.net/mysql-udf-regexp with ^127$

于 2012-06-11T18:04:28.517 に答える
0

PHP の場合:

$string="," . $string . ",";
str_replace("127,", "", $string); 

または、文字列を分割することもできます:

$list=explode(",",$string);
$new="";
foreach($list as $item){
    if($item!="127"){
         $new.=$item.",";
    }
$new=substr_replace($new ,"",-1);

それはうまくいくはずです。

于 2012-06-11T18:17:19.883 に答える
0

pyrateが示唆するように、MySQLでこれを試してください

TRIM(BOTH ',' FROM REGEX_REPLACE(column, '127\,?', ''))

UDFの使用

お役に立てれば

于 2012-06-11T18:28:44.223 に答える