Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 5.1按错误顺序插入/选择数据_Mysql_Sql - Fatal编程技术网

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。谢谢你的编辑。我忘了化名了。博士后也要求这样做。