0

2 人のユーザー間の類似性を計算するテーブルがあります。例えば

user1   user2    similarity
  1       3          0.7
  2       1          0.9
 ...     ...         ...
 ...     ...         ...
 ...     ...         ...

必要なのは、テーブルをモデル化して、上記のモデルを取得したら、次の挿入を行うことです。

replace into table values(3,1,0.4)

実際に最初の行を更新します。この種の状況に対する標準的な慣行はありますか? つまり、user1 と user2 の組み合わせは一意である必要があります。たとえば、(3,1) は (1,3) と同じと見なされます。

4

2 に答える 2

1

次のようなストアド プロシージャに頼る必要があると思います。

CREATE PROCEDURE InsertOrUpdateSimilarity (
    pu1 INT, pu2 INT, ps FLOAT -- user1, user2, similarity
)
BEGIN
    -- try to update either (pu1, pu2) or (pu2, pu1)
    UPDATE similarities SET similarity = ps
    WHERE (user1 = pu1 AND user2 = pu2) OR (user1 = pu2 AND user2 = pu1) ;

    IF ROW_COUNT() = 0
    THEN -- no row has been updated, record must be created
        INSERT INTO similarities VALUE (pu1, pu2, ps) ;
    END IF ;
END ;

@Vatevのソリューションは一見魅力的に見えましたが、トリガーを使用して目的の動作を実装することはできないと思います。それの訳は

UPDATE1) を に変換することは不可能でありINSERTその逆も同様です。

[トリガー]は、関数またはトリガーを呼び出したステートメントによって (読み取りまたは書き込みのために) 既に使用されているテーブルを変更することはできません

2) UPDATE トリガーは、現在変更中の行にのみアクセスできます。

于 2013-08-13T12:57:27.147 に答える
0

テーブル内のuser1とuser2の任意の組み合わせをチェックするトリガーをテーブルに書き込むことができ、組み合わせが存在する場合は、対応する行を更新します。

于 2013-08-13T12:41:42.167 に答える