Как вставить значения индексированного массива в таблицу MySQL в том же порядке, что и массив - PullRequest
0 голосов
/ 17 августа 2011

Позвольте мне вначале сказать, что я новичок в MySQL!

Я пытаюсь создать модуль Drupal, который создает собственный список опций для атрибутов моего продукта.У меня есть индексированный массив дат в порядке убывания, и для каждого значения даты в массиве запрос ниже должен создать параметр атрибута, который хранится в поле «имя» (varchar) моей таблицы uc_attribute_options.Однако, когда я смотрю на вывод списка или на мое поле «имя» (просматривая его в «Сортировать по ключу: нет»), значения даты в списке вывода отображаются в алфавитном порядке, а не в том же порядке убывания, что и в моеммассив.Я пробовал каждую комбинацию, о которой только мог придумать, но, похоже, я не могу "разобраться" с этим.

$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

Как получить вывод для вывода в том же порядке убывания, как найденов массиве?

Заранее спасибо за любые указатели.

Ответы [ 4 ]

1 голос
/ 17 августа 2011

<insert comment about row order here>

Хорошо, поэтому я пишу это, потому что это законный вопрос, даже если приложение выключено (не должно иметь значения в реляционной базе данных (даже с auto_increment), yada yadaяда):

$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 голосов
/ 17 августа 2011

Порядок вещей, поступающих в базу данных, обычно не имеет значения, если он хранится как дата, вы можете использовать запрос ORDER BY, чтобы получить вещи в определенном порядке при получении. Например:

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

Вы также должны хранить тип Date, а не строку, таким образом сравнение станет намного проще, и строки будут сортироваться по алфавиту, что не даст вам желаемых результатов.

0 голосов
/ 17 августа 2011

В реляционной базе данных нет «встроенного» порядка строк.

Вы должны выполнить сортировку в соответствии с содержимым строки (либо в SQL, либо в вашей программе), либо, если это невозможно, вы должны сделать это возможным, добавив еще один столбец, в котором хранится нужный порядок сортировки.

В вашем случае, похоже, что вы можете заказать по столбцу даты (но вам нужно хранить дату как таковую, а не как строку, потому что это будет просто сортировать бессмысленным алфавитным способом).

Если исходный массив не всегда гарантированно находится в определенном порядке, вам может понадобиться добавить индекс массива в качестве дополнительного столбца - возможно, именно для этого ordering и был).

0 голосов
/ 17 августа 2011

Строки в базе данных не имеют собственного порядка.Если вы не укажете порядок при их выборе, база данных сможет вернуть их в любом порядке.Это не обязательно будет порядок вставки.Если вы хотите, чтобы ваши выходные данные были в определенном порядке, вы должны запросить их в этом порядке, а не менять способ вставки данных.

Если вам нужна помощь с этим, код для обмена - это та часть, которая выбираетданные и отображает их, а не часть, которая вставляет строки.

...