这是我的表:
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排列然后命名。我想改变错误的位置数字。
答案 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示例。