簡體   English   中英

在列中設置唯一值,如果不唯一,則將其他值向下移動

[英]Set unique value in column and if its not unique move other one down

我對此有疑問。 我需要在event表中的名為order列中獲得唯一值。 這件事應該如何表現:例如我有table`event

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

例如,當我嘗試將skating順序更新為1時,

| 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();

如果您無法理解,請問我,我將盡力解釋所有事情。

您不需要使用用戶變量來重新生成所有訂單,因為您只需向其添加1 ,除了移動到位置1的元素。 因此,您可以使用IFCASE

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM