2016-12-17 2 views
0

私はこれに問題があります。私が必要とするのは、私のeventテーブルにorderという列の一意の値を取得することです。この事は、どのように振る舞うべきか :例えば私はテーブルの `イベントカラムにユニークな値を設定し、ユニークでない場合は他のカラムを下に移動

| id | name | order | 
|----|---------|-------| 
| 1 | walking | 1  | 
| 2 | diving | 2  | 
| 3 | skating | 3  | 

を持っている例えば、私は1skating順序を更新しようとすると、私は

| id | name | order | 
|----|---------|-------| 
| 3 | skating | 1  | 
| 1 | walking | 2  | 
| 2 | diving | 3  | 

を取得するには、それを行うにはどのようには考えています、これを試してみましたが、それは私のためには機能しません:

Yii::$app->db->createCommand(" 
     SET @rownum :=0; 
     UPDATE " . self::tableName() . " 
     LEFT JOIN (
      SELECT id, (@rownum := @rownum + 1) AS rowNumber 
      FROM " . self::tableName() . " 
      ORDER BY order ASC 
     ) as tmp_table 
     on tmp_table.id = " . self::tableName() . ".id 
     SET " . self::tableName() . ".order = tmp_table.rowNumber" 
    )->execute(); 

あなたが理解できない場合は、私はすべてのことを説明しようとします。

+0

Idフィールドは、更新前の3だっ変化していなかったと更新後は3です。しかし、注文は3から1に変更されました –

+0

私の悪いことはテーブル – e4c5

+0

を間違って読んでしまいました。つまり、スケートとウォーキングの間でスワップされる注文列の価値を言いますか? – e4c5

答えて

1

1に移動する要素を除いて、1を追加するだけなので、ユーザー変数を使用してすべての注文を再生成する必要はありません。だからIFまたはCASEでそれを行うことができます。

UPDATE yourTable 
SET `order` = CASE name 
    WHEN 'skating' THEN 1 
    ELSE `order` + 1 
END 

あなたは1以外のいくつかの場所に要素を移動できるようにする必要がある場合は、それは少し複雑になります:

UPDATE yourTable 
SET `order` = CASE 
    WHEN name = 'skating' THEN @newpos 
    WHEN `order` >= @newpos THEN `order` + 1 
END 
関連する問題