Mysql 通过对表格重新排序来更新位置字段

Mysql 通过对表格重新排序来更新位置字段,mysql,prestashop,Mysql,Prestashop,我正试图重新安排一张桌子。 此表包含产品的属性列表。我想按字母顺序重新排列所有“颜色”属性(id\u attribute\u group=2)(白色和黑色除外)。此查询为我提供了所需的结果: SELECT a.`id_attribute`, a.`id_attribute_group`, a.`color`, (@count := @count + 1) AS position FROM `ps_attribute_lang` al, `ps_attribute` a CROSS JOIN (S

我正试图重新安排一张桌子。
此表包含产品的属性列表。我想按字母顺序重新排列所有“颜色”属性(
id\u attribute\u group
=2)(白色和黑色除外)。此查询为我提供了所需的结果:

SELECT a.`id_attribute`, a.`id_attribute_group`, a.`color`, (@count := @count + 1) AS position
FROM `ps_attribute_lang` al, `ps_attribute` a
CROSS JOIN (SELECT @count := 0) tcount 
WHERE a.`id_attribute` = al.`id_attribute`
AND a.`id_attribute_group` = 2
ORDER BY
CASE
    WHEN  al.`name` LIKE '% - white' THEN 1
    WHEN al.`name` LIKE '% - black' THEN 2
    ELSE SUBSTRING(al.`name`, LOCATE(' - ', al.`name`)+3) #prefix for color
END 
ASC
产生类似于

+==============+====================+=========+==========+
| id_attribute | id_attribute_group | color   | position |
+==============+====================+=========+==========+
| 12           | 2                  | #FFFFFF | 1        | // WHITE
+--------------+--------------------+---------+----------+
| 45           | 2                  | #FEFEFE | 2        | // WHITE
+--------------+--------------------+---------+----------+
| 25           | 2                  | #000000 | 3        | // BLACK
+--------------+--------------------+---------+----------+
| 1112         | 2                  | #010101 | 4        | // BLACK
+--------------+--------------------+---------+----------+
| 120          | 2                  | #57585C | 5        | // ANTHRACITE
+--------------+--------------------+---------+----------+
| ...          | ...                | ...     | ...      | // ANTHRACITE
+--------------+--------------------+---------+----------+
| 6            | 2                  | #4D5166 | 1150     | // ZINC
+--------------+--------------------+---------+----------+
太好了!现在我只想
替换
条目:

REPLACE INTO `ps_attribute` 
[the previous query]
现在它按id订购所有东西,但确实改变了位置:

+==============+====================+=========+==========+
| id_attribute | id_attribute_group | color   | position |
+==============+====================+=========+==========+
| 1            | 2                  | #ab4894 | 1        | 
+--------------+--------------------+---------+----------+
| 2            | 2                  | #ba4158 | 2        | 
+--------------+--------------------+---------+----------+
| 3            | 2                  | #016873 | 3        | 
+--------------+--------------------+---------+----------+
| 4            | 2                  | #894657 | 4        | 
+--------------+--------------------+---------+----------+
| 5            | 2                  | #fa4891 | 5        | 
+--------------+--------------------+---------+----------+
| ...          | ...                | ...     | ...      | 
+--------------+--------------------+---------+----------+
| 1150         | 2                  | #4894af | 1150     | 
+--------------+--------------------+---------+----------+
我错过了什么?我还尝试创建一个
临时表,但它也不起作用。如果我用

SELECT * FROM `temp` ORDER BY `position` 

我得到了与上面相同的结果。我还尝试使用
插入到。。。在重复键更新时

也许您可以
更改表:

ALTER TABLE
    ps_attribute_lang as al
ORDER BY
CASE
    WHEN  al.`name` LIKE '% - white' THEN 1
    WHEN al.`name` LIKE '% - black' THEN 2
    ELSE SUBSTRING(al.`name`, LOCATE(' - ', al.`name`)+3) #prefix for color
END 
ASC
编辑

尝试通过以下方式重新编号:

    SELECT result.*, (@count := @count + 1) AS position
FROM
(SELECT a.`id_attribute`, a.`id_attribute_group`, a.`color`, al.`name`
FROM `ps_attribute_lang` al, `ps_attribute` a
WHERE a.`id_attribute` = al.`id_attribute`
AND a.`id_attribute_group` = 2
AND al.`id_lang` = 1
ORDER BY
CASE
    WHEN  al.`name` LIKE '% - white' THEN 1
    WHEN al.`name` LIKE '% - black' THEN 2
    ELSE SUBSTRING(al.`name`, LOCATE(' - ', al.`name`)+3) #prefix for color
END 
ASC) as result
CROSS JOIN (SELECT @count := 0) tcount

我只是缺少了一个
,其中
条件:

AND al.`id_lang` = 1

现在,使用
REPLACE-INTO
的查询工作正常。但我仍然不明白,没有这个条件,为什么这不起作用

我不是sql中的神,但我看不出这会如何更新
位置
字段,我想
更改表
是用来更改其架构的。您想重新排序原始表(哪个?)还是以新的顺序生成新表?重新排序原始
ps_属性
表(
ps\u attribute\u lang
仅用于实际颜色名称)我花了几个小时只为了一件小事……这让我发疯。无论如何,
ALTER TABLE AS t
给了我语法错误你能提供SQLFIDLE或一些示例数据(CREATE语句)吗?在没有数据的复杂查询中很难找到解决方案。。。