更新表以根据文本列记录位置

时间:2015-06-16 20:00:44

标签: mysql sql

这是我的表:

id | position | name
1  |  2       | a
1  |  3       | b
1  |  1       | c
-------
2  |  1       | a
2  |  3       | b
2  |  4       | c
2  |  2       | d
--------
3  |  2       | a
3  |  1       | b

如何编写UPDATE语句(非SELECT)来获取这样的表?

id | position | name
1  |  1       | a
1  |  2       | b
1  |  3       | c
-------
2  |  1       | a
2  |  2       | b
2  |  3       | c
2  |  4       | d
--------
3  |  1       | a
3  |  2       | b

该职位将始终以1开始。

目前我的代码是

ORDER BY id, name

所以它首先由id排列然后命名。我想改变错误的位置数字。

1 个答案:

答案 0 :(得分:1)

如果要更新表格以使位置列对应于“名称”列的位置(在此示例中为字母表),则可以使用案例陈述:

UPDATE myTable SET position =
   CASE
      WHEN name = 'a' THEN 1
      WHEN name = 'b' THEN 2
      WHEN name = 'c' THEN 3
      ...
      ELSE 26
   END;

以下是SQL Fiddle示例。

修改

要根据您拥有的字符串进行排序,您可以先使用变量编写查询,以获取每个字符串的位置,如下所示:

SET @position := 0;

SELECT @position := @position + 1, name
FROM(
  SELECT DISTINCT name
  FROM myTable
  ORDER BY name) t;

拥有该临时表后,您可以将其加入原始表并更新原始position以匹配临时表的position,如下所示:

SET @position := 0;

UPDATE myTable m
JOIN(
  SELECT @position := @position + 1 AS position, name
  FROM(
    SELECT DISTINCT name
    FROM myTable
    ORDER BY name) t) tmp ON tmp.name = m.name
SET m.position = tmp.position;

以下是SQL Fiddle示例。