我创建了两张桌子和一张桌子。插入的值如下所示。
create table maxID (myID varchar(4));
insert into maxID values ('A001');
insert into maxID values ('A002');
insert into maxID values ('A004');
insert into maxID values ('A003');
create table maxID2 (myID varchar(4) PRIMARY KEY);
insert into maxID2 values ('A001');
insert into maxID2 values ('A002');
insert into maxID2 values ('A004');
insert into maxID2 values ('A003');
执行查询时
SELECT myId, @rowid:=@rowid+1 as myrow
FROM maxID, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;
我输出为
+++++++++++++
myid + myrow
+++++++++++++
A003 + 4
+++++++++++++
执行查询时
SELECT myId, @rowid:=@rowid+1 as myrow
FROM maxID2, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;
我输出为
+++++++++++++
myid + myrow
+++++++++++++
A004 + 4
+++++++++++++
两个表之间的区别在于,在第二个表中,我的myID为PRIMARY KEY
。
您可以在www.sqlfiddle.com查看以上数据/结果。
为什么在查询相同时我得到两个不同的结果?
注意: 此问题与我的旧问题 Getting last record from mysql 有点相关,其中我几乎得到了答案,Yak告诉我,行的顺序不能保证。 :(
答案 0 :(得分:7)
这是因为当选定的字段集完全包含在给定的索引字段集中时,此索引用于检索数据而不是全扫描结果。
由于索引具有默认排序顺序,因此当原始表数据不具有时,使用索引的提取数据的排序顺序与完整表扫描的顺序不同。
在你的情况下,当你使用主键时,第4行确实是第4行,因为内部mysql(oracle,sql server ...)以这种方式组织它以更快地搜索数据。
请注意,您可能在两个查询中都获得了相同的结果,只是因为默认选择的结果顺序确实未被证明与插入的订单相关。
最后,让我警告你,如果你计划在mysql中添加一个具有特定顺序的索引(例如描述here),那么就可以在DESC命令中检索行,你可以不要这样做,因为它还不是mysql中允许的功能:
index_col_name规范可以以ASC或DESC结尾。这些 允许使用关键字以用于指定升序的未来扩展 或降序索引值存储。目前,他们被解析但是 忽略;索引值始终按升序存储。
答案 1 :(得分:4)
Primary keys are returned in sorted order by default
这就是为什么你为两个查询获得不同的输出。
您也可以查看其他示例:here is the example