根据ID

时间:2015-06-16 17:08:07

标签: mysql

这是我的表格的样子

id|position | name  
1 | 4       | a
1 | 2       | b
1 | 3       | c
1 | 1       | d
23| 5       | a
23| 1       | b
24| 1       | a

这就是我想要的:

id|position| name
1 | 1      | a
1 | 2      | b
1 | 3      | c
1 | 4      | d
23| 1      | a
23| 5      | b
24| 1      | a

目前我的SQL查询按升序显示id和名称,如下所示:

ORDER BY id, name

(表示它首先排列id,然后是名称)

但是,我想要重新分配 / OVER_WRITE / 更新位置值。因此,对于一个id(具有许多名称),我想按名称的升序分配位置编号。

我希望我的问题很明确。

2 个答案:

答案 0 :(得分:0)

您可以使用INSERT INTO ... SELECT查询从查询​​结果中创建名为newtable的新表:

INSERT INTO newtable (id, position, name)
SELECT t1.id AS id, t1.position AS position, t2.name AS name
FROM (
    SELECT * FROM table ORDER BY id ASC, position ASC
) t1,
(
    SELECT * FROM table ORDER BY id ASC, name ASC
) t2

答案 1 :(得分:0)

update TABLENAME left join  
    (select tp1.id,tp1.name,tp2.position from 
        (select t.*,(select count(*) from TABLENAME where name<t.name) as rownum from TABLENAME t order by id,name) tp1
        left join
        (select t.*,(select count(*) from TABLENAME where position<t.position) as rownum from TABLENAME t order by id,position) tp2
        on tp1.rownum = tp2.rownum
    ) as tmp 
on TABLENAME.id=tmp.id and TABLENAME.name=tmp.name  set TABLENAME.position=tmp.position ;

如果表格除了您显示的列之外还有一些唯一列,您可以使用唯一列替换rownum。现在,我使用count(*)name生成一个唯一列。

此外,这个sql脚本可能会得到结果,但它的效果很差。