2015-10-13 78 views
2

1.I創建一個表MySQL限制1返回訂單結果集的最後一條記錄?

create table sort (
a int, 
b int, 
primary key (a)); 

2.然後我插入三個記錄

insert into sort values(1, 10), (2, 10), (3, 10); 

3.當我選擇使用SQL

select * from sort order by b; 

它給出這樣的結果

+---+------+ 
| a | b | 
+---+------+ 
| 1 | 10 | 
| 2 | 10 | 
| 3 | 10 | 
+---+------+ 
  1. 當我選擇表格時,使用此查詢

    select * from sort order by b limit 1;

而且結果集是這個

+---+------+ 
| a | b | 
+---+------+ 
| 3 | 10 | 
+---+------+ 

這不是我的例外(我想返回的第一個記錄是合理的)。

我的MySQL版本是版本14.14 DISTRIB 23年6月5日,爲osx10.8下(x86_64)

任何能解釋這樣對我?謝謝。

+0

爲什麼要返回第一個?您按列'B'排序,'A'列不相關,MySQL將以不同於GUI中看到的方式將數據存儲在文件中,它對錶格進行排序並抓取具有最低'B'值的列,有更低的'B'排嗎?不,這意味着查詢是正確的,如果你想要返回第一行,然後按b添加訂單,一個 – ogres

+0

有趣。我試了一下(使用innodb和myisam,以防有所作爲),並得到第一行(a = 1),作爲限制1的結果(如您所料)。 –

+0

@ogres補充說,作爲一個答案 – e4c5

回答

0

這是因爲當你輸入select * from sort order by b;這將加載隱藏字段ACS。這意味着查詢加載所有日期以升序排列

+---+------+ 
| a | b | 
+---+------+ 
| 1 | 10 | 
| 2 | 10 | 
| 3 | 10 | 
+---+------+ 

但是如果你使用它select * from sort order by b limit 1;再次ACS加載數據,然後你必須用條件LIMIT 1。所以在b列中都是10,所以它會加載最後的那個值。

的Bz MySQL將決定最後添加的行是此SQL Server已經回到合理記錄最新的一個

0

。 因爲您按照具有相同數量的欄(按服務評估)排序。

步驟的SQL Server要做的就是::

檢查是有索引 - >從磁盤/索引讀取表 - >排序的數據 - >獲取排序數據的n個。

(正從查詢)

所以,這個SQL服務器將返回它已經找到了主表內盤(存儲)第一個,因爲ü沒有索引它。



除非您按a,b排序。
你會得到1,10作爲你的結果。

或者創建一個使您的數據順序不同的索引。 (你也可以得到2,10結果)
否則,你會得到第一個插入的數據到磁盤作爲你的結果。

0

我實際上無法解釋行爲,因爲我無法複製它。但我可以證明,OP的預期是如何我的MySQL(版本14.14 Distrib 5.5.44,用於debian-linux-gnu(i686))工作[注意,我以不同的順序插入記錄,以證明一個點):

首先,沒有主鍵:

mysql> create table sort (
    -> a int, 
    -> b int); 
mysql> insert into sort values (3,10),(2,10), (1,10); 
mysql> select * from sort order by b limit 1; 
+------+------+ 
| a | b | 
+------+------+ 
| 3 | 10 | 
+------+------+ 

第一插入的記錄被顯示

並與主鍵:

mysql> create table sort (
    -> a int, 
    -> b int, 
    -> primary key (a)); 
mysql> insert into sort values (3,10),(2,10), (1,10); 
mysql> select * from sort order by b limit 1; 
+---+------+ 
| a | b | 
+---+------+ 
| 1 | 10 | 
+---+------+ 

這是一個MyISAM表(默認開啓我的服務器),所以表中有一個聚集索引,這會導致按照列a的順序讀取表。因此,a = 1是第一個記錄(我相信)。

最後,使用的是InnoDB:

mysql> create table sort ( a int, b int, primary key (a)) engine=myisam; 
mysql> insert into sort values (3,10),(2,10), (1,10); 
mysql> select * from sort order by b limit 1; 
+---+------+ 
| a | b | 
+---+------+ 
| 3 | 10 | 
+---+------+ 

沒有聚簇索引,所以返回進入第一個記錄。

這些都不能解釋OP聲稱的內容,但我無法使其發生。

+0

innodb表的主鍵不是聚簇索引嗎? –

+0

myisam表的主鍵不是聚簇索引。這就是爲什麼myisam和innodb的例子不同(我認爲)。 –

相關問題