以下MySQL语句工作正常,它返回每个结果的行数为rownumber。但是现在,我想要做的是使用更新语句将列pos设置为“row”,因为我不希望使用单个查询循环数千条记录。
有什么想法吗?
SELECT @row := @row + 1 AS row, u.ID,u.pos
FROM user u, (SELECT @row := 0) r
WHERE u.year<=2010
ORDER BY u.pos ASC LIMIT 0,10000
答案 0 :(得分:1)
There is a risk using user defined variables
在SELECT语句中,仅在发送到客户端时评估每个select表达式。这意味着在HAVING,GROUP BY,或ORDER BY子句中,引用在select表达式列表中赋值的变量不能按预期工作:
更安全的防护方法
create table tmp_table
(
pos int(10) unsigned not null auto_increment,
user_id int(10) not null default 0,
primary key (pos)
);
insert into tmp_table
select null, u.ID
from user
where u.year<=2010
order by YOUR_ORDERING_DECISION
limit 0, 10000;
alter table tmp_table add index (user_id);
update user, tmp_table
set user.pos=tmp_table.pos
where user.id=tmp_table.user_id;
drop table tmp_table;