MySQL 5.1按错误顺序插入/选择数据
我试图将数据按排序顺序插入表中,以便以后快速检索。我使用序号列来指定数据的顺序。像这样:MySQL 5.1按错误顺序插入/选择数据,mysql,sql,Mysql,Sql,我试图将数据按排序顺序插入表中,以便以后快速检索。我使用序号列来指定数据的顺序。像这样: SET @ctr = -1; insert into search_data (trans_id, ordinal) select trans_id, @ctr:=@ctr+1 from transactions order by created; 创建的是一个日期时间字段 在不插入的情况下执行select会使行以正确的顺序返回,但ctr变量的增量不正确。例如: +---+----------+---
SET @ctr = -1;
insert into search_data (trans_id, ordinal)
select trans_id, @ctr:=@ctr+1
from transactions
order by created;
创建的是一个日期时间字段
在不插入的情况下执行select会使行以正确的顺序返回,但ctr变量的增量不正确。例如:
+---+----------+--------------+---------------------+
| 1 | trans_id | @ctr:=@ctr+1 | created |
+---+----------+--------------+---------------------+
| 1 | 131379 | 232 | 2011-10-17 12:27:09 |
| 1 | 131377 | 231 | 2011-10-17 12:24:30 |
| 1 | 131311 | 230 | 2011-10-16 23:44:12 |
| 1 | 131305 | 229 | 2011-10-16 21:57:35 |
| 1 | 129948 | 46 | 2011-10-10 13:24:58 |
| 1 | 129947 | 45 | 2011-10-10 13:24:58 |
| 1 | 129946 | 44 | 2011-10-10 13:24:58 |
| 1 | 129945 | 43 | 2011-10-10 13:24:58 |
| 1 | 129944 | 42 | 2011-10-10 13:24:58 |
这种技术在MySQL 5.0、4.x和3.x中都很有效。但它在5.1中不起作用
看起来排序是在变量递增之后进行的,而之前变量是在排序之后递增的
有什么想法吗?在ctr变量初始化的末尾有一个撇号标记。请检查它是否符合语法。我认为编译器被撇号符号弄糊涂了。在ctr变量初始化的末尾有一个撇号符号。请检查它是否符合语法。我认为编译器被那个撇号弄糊涂了。尝试子查询它:
select trans_id, @ctr:=@ctr+1
from ( select trans_id
from transactions
order by created, trans_id ) as t
asdfasdf尝试子查询它:
select trans_id, @ctr:=@ctr+1
from ( select trans_id
from transactions
order by created, trans_id ) as t
asdfasdf子查询它?选择trans_id,@ctr:=@ctr+1从创建的交易订单中选择trans_id,trans_id谢谢你,格伦,你今晚为我省了很多麻烦。把它贴出来作为回答,我会接受的。谢谢。我想知道在两次发布之间行为是否发生了变化?我不知道mysql的规则,但Oracle在使用rownum时特别对subquery说:如果在同一个查询中rownum后面有一个ORDER BY子句,那么这些行将由ORDER BY子句重新排序。结果可能因访问行的方式而异。它在不同版本之间肯定会发生变化。我打开了两个窗口,5.0和5.1并排打开,可以看到不同的行为。新方法似乎更合理,即使它确实破坏了我的代码。子查询它?选择trans_id,@ctr:=@ctr+1从创建的交易订单中选择trans_id,trans_id谢谢你,格伦,你今晚为我省了很多麻烦。把它贴出来作为回答,我会接受的。谢谢。我想知道在两次发布之间行为是否发生了变化?我不知道mysql的规则,但Oracle在使用rownum时特别对subquery说:如果在同一个查询中rownum后面有一个ORDER BY子句,那么这些行将由ORDER BY子句重新排序。结果可能因访问行的方式而异。它在不同版本之间肯定会发生变化。我打开了两个窗口,5.0和5.1并排打开,可以看到不同的行为。新方法似乎更合理,即使它确实破坏了我的代码。谢谢,但这只是一个复制/粘贴错误,真正的代码不是这样的。修正了问题。谢谢,但这只是一个复制/粘贴错误,真正的代码不是这样的。修正了问题。再次感谢,我编辑了它,将其添加为t,以避免MySQL错误。每个派生表都必须有自己的别名。或者更确切地说,我试图编辑它,但它告诉我编辑中必须至少有6个字符,所以我添加了asdfasdf,但它不允许我删除它。有趣的是,我甚至没有注意到asdfasdf。谢谢你的编辑。我忘了化名了。Postgres也要求这样做。再次感谢,我编辑了它,将其添加为t,以避免MySQL错误。每个派生表都必须有自己的别名。或者更确切地说,我试图编辑它,但它告诉我,我的编辑中必须至少有6个字符,所以我添加了asdfasdf,但它不允许我删除它。这很有趣,我甚至没有注意到asdfasdf。谢谢你的编辑。我忘了化名了。博士后也要求这样做。