2012-02-15 33 views
-1

我想從一個SQL數據庫表中插入數據到另一個。它需要以指定的順序插入,因爲我打算將表中的數據提取到csv文件以創建目錄。我在主表中有超過50000個項目,並且想要將約500個項目提取到新表格中。從SQL表中插入指定順序

我已經創建了一個表單來輸入參考編號(ref),它創建了一個參考編號數組。

<form action="list.php" method="post"> 
      <p>List Number <input name="list_no" type="text"></p> 
     <table align="center" width="50%"> 
    <tr> 
     <td><input name="item[]" type="text" style="width: 80px"></td> 
     <td></td> 
     <td><input name="item[]" type="text" style="width: 80px"></td> 
     <td></td> 
     <td><input name="item[]" type="text" style="width: 80px"></td> 
     <td></td> 
     <td><input name="item[]" type="text" style="width: 80px"></td> 
     <td></td> 
     <td><input name="item[]" type="text" style="width: 80px"></td> 
    </tr> 
     </table> 
    <p>Step 4: Create List.<input name="Submit1" type="submit" value="Create List" /></p> 
在list.php的我已經創建的代碼在我的名單...取決於數量的數據庫中創建一個新表

表單上輸入。我從表中分配給陣列

$item=$_POST['item']; 

我知道在$項目是在我進入它的形式排列的數據,因爲我已經使用$ item_list =破滅數據(「」,$項) ;並echo $ item_list來檢查輸入數據的順序,並用逗號分隔數據。

我list.php的頁面,然後使用代碼

$insert="INSERT INTO list$list_no (ref, description, price_s) 
     SELECT ref, description, price_s 
     FROM stock 
     WHERE ref IN ($item_list)"; 

mysql_query($insert) or die(mysql_error());

進入項目到新表。它輸入所有已請求的項目,但似乎按照ref的順序輸入它們,而不是按照我將它們輸入原始表單的順序輸入。

關於如何糾正這個問題的任何想法?

很多預先感謝!

+1

聽起來像ref是一個索引。你能不能在你的SELECT查詢中添加一個ORDER BY子句來寫入csv? – CBusBus 2012-02-15 09:44:59

+1

你的主要關鍵是什麼?你可以發佈你的SQL模式嗎? – CompanyDroneFromSector7G 2012-02-15 09:45:06

+4

以特定順序插入沒有任何意義。表格中的行不是**排序。 – 2012-02-15 09:58:44

回答

-1

您需要ORDER BYref場在SELECT查詢,FIND_IN_SET將保留順序:

$insert = sprintf("INSERT INTO list%s (ref, description, price_s) 
        SELECT ref, description, price_s 
        FROM stock 
        WHERE ref IN ('%s') 
        ORDER BY FIND_IN_SET(ref, '%s')", $list_no, $item_list, $item_list); 

編輯:你真的應該改變你的數據庫設計。這不是一個好方法。

+0

感謝您的快速回復。 %s代表什麼?我剛剛運行了您建議的查詢,並將表單中的第一項添加到新表中,但不添加任何其他內容。 你如何建議數據庫應該被設計? Thansk – JadeTech 2012-02-15 10:30:17

+0

%s - 表示一個字符串。所以第一個%s將被替換爲$ list_no。請參閱[sprintf](http://fr2.php.net/sprintf) – Flukey 2012-02-15 10:31:37

+0

謝謝,這是有道理的。在你發佈的文章上說,sprintf與printf的工作方式相同,所以我用printf替換了sprintf,並收到以下錯誤:「INSERT INTO list102(ref,description,price_s)SELECT ref,description,price_s FROM stock WHERE ref IN 45154,64608,26830,66118,65386')ORDER BY FIND_IN_SET(ref,'45154,64608,26830,66118,65386')您在SQL語法中有錯誤;檢查與您的MySQL服務器版本對應的手冊在第1行'197'附近使用正確的語法「。我仍然只將第一項插入表中。 – JadeTech 2012-02-15 11:14:05

0

以特定順序插入沒有任何意義。

表中的行是而不是排序。

你必須使用ORDER BY

的MySQL,由於它的聚集主鍵索引反正插入時會重新排序行retrieveal(從「名單」表)中對它們進行排序。

+0

@Downvoter:請發表評論 – 2012-02-15 11:27:18

0

It needs to be inserted in a specified order

不是。

as I am planning on extracting the data in the table to a csv file to create a catalogue.

歡迎您使用ORDER BY進行此操作。

I have over 50000 items in my main table and want to extract about 500 into the new table.

你不想再次。在同一日期有兩張表是沒有意義的。
爲什麼不能從原始表中生成CSV?