2012-03-28 57 views
0

我試圖按排序順序將數據插入表中,以便以後快速檢索。我使用序號列來指定數據的順序。像這樣:MySQL 5.1插入/選擇錯誤訂單中的數據

SET @ctr = -1; 

insert into search_data (trans_id, ordinal) 
select trans_id, @ctr:[email protected]+1 
from transactions 
order by created; 

created is a datetime field。

在沒有插入的情況下執行select會導致行按正確的順序返回,但ctr變量不會正確地增加。例如: -

+---+----------+--------------+---------------------+ 
| 1 | trans_id | @ctr:[email protected]+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中不起作用。

好像排序變量遞增之後,正在做的,而以前的變量是那種

任何想法後會增加嗎?

+0

子查詢呢?從中選擇trans_id,@ctr:= @ ctr + 1(從創建的交易訂單中選擇trans_id,trans_id) – Glenn 2012-03-28 03:17:29

+0

謝謝格倫,今晚你爲我節省了很多麻煩。發佈這個答案,我會「接受」它。 – NXT 2012-03-28 03:31:01

+0

謝謝。我想知道發佈之間的行爲是否改變我不知道mysql規則,但是Oracle在使用rownum時特別提到了子查詢:如果ORDER BY子句在同一查詢中跟隨ROWNUM,那麼行將由ORDER BY子句重新排序。結果可能會根據行訪問的方式而有所不同。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm – Glenn 2012-03-28 03:37:18

回答

2

嘗試子查詢它:

select trans_id, @ctr:[email protected]+1 
    from (select trans_id 
      from transactions 
      order by created, trans_id) as t 

asdfasdf

+0

再次感謝,我編輯它以添加「as t」到最後以避免MySQL錯誤(「每個派生表都必須有自己的別名」)。 – NXT 2012-03-28 03:37:30

+0

或者我試圖編輯它,但它告訴我我的編輯中至少有6個字符,所以我添加了asdfasdf,但它不會讓我刪除它。 – NXT 2012-03-28 03:39:52

+0

這很有趣,我甚至沒有注意到asdfasdf。感謝編輯。我忘了別名。 Postgres也要求。 – Glenn 2012-03-28 03:43:03

1

變量ctr初始化結束時有一個撇號標記。請檢查它是否符合語法。我認爲編譯器被這個撇號標記弄糊塗了。

+0

謝謝,但這只是一個複製/粘貼錯誤,真正的代碼不是這樣的。修正了問題。 – NXT 2012-03-28 03:32:43