2011-08-17 27 views
0

まずはMySQLに慣れていると言います。配列と同じ順序でインデックス付き配列の値をMySQLテーブルに挿入する方法

私は製品属性のオプションのカスタムリストを作成するDrupalモジュールを構築しようとしています。私は降順で日付のインデックス配列を持っており、配列内の各日付値に対して、以下のクエリは、uc_attribute_optionsテーブルの 'name'フィールド(varchar)に格納されている属性オプションを作成することになっています。しかし、リストの出力や「name by」フィールド(「Sort by key:None」)を見ると、出力リストの日付の値は、myと同じ降順ではなくアルファベット順に表示されますアレイ。私は考えることができるすべての組み合わせを試しましたが、私はこれを「並べ替える」ようには見えません。

$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

また、DBに実際の日付として日付を格納することもできます( '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 

また、日付型ではなく、文字列を格納する必要があり、このように比較がはるかに容易になり、文字列は、あなたが望む結果を与えることはありませんどのアルファベット順に並べ替えます。

+0

ありがとうございます。今はっきりしている。はい、私の値をDate型として保存できるのであれば、間違いなく状況を改善しているはずです。残念ながら、それは選択肢ではありませんでした。データベースの一部を変更または変更することはできません。ポインタをもう一度ありがとう! – user897897

+0

私はテーブルを書き直すことを検討し、日付を文字列として保存することは悪い考えであり、あなたのケースでは苦労しています。 –

+0

合意しました!私は間違いなくそれをさらに調べます。再度、感謝します。 – user897897

0

リレーショナルデータベースには、「固有の」行順序はありません。

行の内容(SQLまたはプログラムのいずれか)に応じてソートするか、不可能な場合は、必要なソート順を格納する別の列を追加する必要があります。

あなたのケースでは、日付列で注文することができます(文字列ではなく、無意味なアルファベット順でソートするので、日付をそのように保存する必要があります)。

元の配列が必ずしも定義された順序であると保証されない場合は、追加の列として配列インデックスを追加する必要があります。orderingの場合があります。

+0

ポインタありがとう、非常に有用な情報。私はおそらくアイテムの順序と挿入順序の間に関連性があったという印象を受けていました。残念ながら、フィールドタイプを日付フィールドに変更することはできません。そのため、ほとんどの場合、回避するのが難しいと感じていました。 [uc_attributes_schema]を見ると、 'ordering'フィールドは 'オプションのリストの位置に影響します'と記述されています。ですから、私が理解しているように、事実上、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

スニペットありがとう!間違いなく私を正しい方向に向ける。フィールド型をDate型に変更できないことを考えれば、この解決策は完璧なものであり、その制約を回避するのに役立ちます。非常に役立ちます。再度、感謝します。 – user897897

+0

私はあなたの提案されたソリューションを使って同じロードブロッキングを打ったようです。インデックス付き配列でも連想配列でも違いはないようです。同じ結果が得られます。タイムスタンプ順であっても数値インデックス順であれ、出力は同じです。 – user897897

+0

だからこそ、多くの人がDBの挿入順序はあまり重要ではないと言いました。しかし、私はあなたに保証します、これは値を並べ替えるために働く。 – cwallenpoole

関連する問題