2011-08-17 59 views
0

讓我先說這個,說我是MySQL的新手!如何按照與數組相同的順序將索引數組的值插入到MySQL表中

我正在嘗試構建一個Drupal模塊,爲我的產品屬性創建一個自定義選項列表。我有一個按降序排列的日期索引數組,下面的查詢應該創建一個屬性選項,該選項存儲在我的uc_attribute_options表的'name'字段(varchar)中。但是,當我查看列表輸出或我的'名稱'字段(在'按鍵排序:無'中查看它時),輸出列表中的日期值按字母順序顯示,而不是按照我的降序排列陣列。我嘗試過所有我能想到的組合,但我似乎無法「排序」出來。

$aid = 1; 
$i = 0; 

$date_array = array ( 
"Thursday, August 25, 2011", 
"Thursday, September 1, 2011", 
"Thursday, September 8, 2011", 
"Thursday, September 15, 2011", 
"Thursday, September 22, 2011"); 

foreach ($date_array as $item) { 

db_query("INSERT INTO {uc_attribute_options} (aid, name, cost, price, 
weight, ordering) VALUES (%d, '%s', %f, %f, %f, %d)", $aid, $item, 0, 0, 0, 0); 

... 
} 

輸出:

Thursday, August 25, 2011 
Thursday, September 1, 2011 
Thursday, September 15, 2011 
Thursday, September 22, 2011 
Thursday, September 8, 2011 

我想什麼:

Thursday, August 25, 2011 
Thursday, September 1, 2011 
Thursday, September 8, 2011 
Thursday, September 15, 2011 
Thursday, September 22, 2011 

我怎樣才能輸出在同一個從大到小的順序顯示爲陣列中發現了什麼?

在此先感謝任何指針。

+0

嘗試使用2位數日期?如果你從MySQL獲得這些值,只需在查詢中對它們進行排序,讓MySQL進行排序。 –

+0

或者更好,將日期作爲實際日期存儲在數據庫中(請參閱'DATE'列類型)。 – Casper

+0

@DustinDavis - 我試過這種方法作爲最後的手段,它確實似乎解決了這個問題。所以,如果沒有其他選擇,這絕對是一種做法。感謝您的迴應。 – user897897

回答

0

數據庫中的行沒有固有順序。如果您在選擇它們時未指定訂單,則數據庫可以按照所需順序自由返回它們。這不一定是插入順序。如果您希望以特定順序輸出,則必須按順序詢問,而不是更改插入數據的方式。

如果您需要幫助,共享的代碼是選擇數據並顯示它的部分,而不是插入行的部分。

+0

欣賞信息,非常有幫助。 – user897897

0

進入數據庫的東西的順序通常是無關緊要的,如果這是作爲日期存儲的,則可以使用ORDER BY查詢在檢索時按特定順序獲取事物。例如:

SELECT date FROM my_table ORDER BY date ASC; -- or in some cases ASCENDING 

你也應該存儲Date類型,而不是一個字符串,這樣比較變得更加容易和字符串會按字母順序排序,不會給你你想要的結果。

+0

感謝您的回覆。現在很清楚。是的,如果我可以將我的值存儲爲日期類型,它肯定會糾正這種情況。不幸的是,這不是一個選擇。我不能修改或修改數據庫的任何部分。再次感謝指針! – user897897

+0

我會考慮重寫表格,將日期存儲爲字符串是一個壞主意,並使得在你的情況下與他們一起工作。 –

+0

同意!我一定會進一步研究它。再次感謝。 – user897897

0

關係數據庫中沒有行的固有順序。

您必須根據行內容(在SQL中或在您的程序中)進行排序,或者,如果這不可行,您必須通過添加另一列來存儲您想要的排序順序。

就你而言,它看起來像你可以在日期列上訂購(但你需要存儲日期,而不是一個字符串,因爲這將只是按照無意義的字母順序排序)。

如果原始數組並不總是保證按照定義的順序,那麼可能需要將數組索引作爲額外的列添加 - 也許這就是ordering的原因)。

+0

謝謝你的指針,非常有用的信息。我的印象是,這個項目的順序和插入順序之間可能存在關聯。不幸的是,我不能將字段類型修改爲日期字段,所以這很大程度上是我發現很難解決問題的原因。 看着[uc_attributes_schema],它將'排序'字段描述爲'影響選項的列表位置'。所以,據我瞭解,它實際上是Drupal自動添加的字段權重。 [uc_attribute_schema](http://api.lullabot.com/uc_attribute_schema) – user897897

1

<insert comment about row order here>

好了,所以我在寫這一點,因爲它是一個合法的問題,即使在應用程序關閉(不應該在關係數據庫中(即使有AUTO_INCREMENT),亞達內容十分重要重要):

$date_array = array ( 
"Thursday, August 25, 2011", 
"Thursday, September 1, 2011", 
"Thursday, September 8, 2011", 
"Thursday, September 15, 2011", 
"Thursday, September 22, 2011"); 

$out = array(); 
// create an associative array which maps numeric timestamps to the dates. 
foreach($date_array as $date) 
    $out[ strtotime($date) ] = $date; 
// sort the keys (the timestamps) 
ksort($out); 

// this will output in timestamp order. 
foreach($out as $item) 
{ 
    db_query("INSERT INTO {uc_attribute_options} (aid, name, cost, price, weight, 
     ordering) VALUES (%d, '%s', %f, %f, %f, %d)", $aid, $item, 0, 0, 0, 0); 
} 
+0

謝謝你的片段!它絕對讓我走向正確的方向。鑑於我無法將我的字段類型更改爲日期類型,此解決方案非常適合並幫助我解決該問題。很有幫助。再次感謝。 – user897897

+0

我似乎使用您的建議解決方案擊中了相同的障礙。無論它是索引數組還是關聯數組,它都沒有區別。它產生相同的結果。無論是時間戳順序還是數字索引順序,輸出仍然是相同的。 – user897897

+0

這就是爲什麼很多人都提到db插入順序並不重要。但我向你保證,這有助於重新分類價值。 – cwallenpoole

相關問題