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语句)吗?在没有数据的复杂查询中很难找到解决方案。。。