2011-08-17 2 views
0

먼저 MySQL을 처음 사용한다고 말하면서 소개하겠다!배열과 동일한 순서로 인덱스 된 배열의 값을 MySQL 테이블에 삽입하는 방법

내 제품 속성에 대한 옵션의 사용자 지정 목록을 만드는 Drupal 모듈을 작성하려고합니다. 배열의 내림차순으로 날짜의 인덱스 배열을 가지고 있고 배열의 모든 날짜 값에 대해 아래 쿼리는 uc_attribute_options 테이블의 'name'필드 (varchar)에 저장된 속성 옵션을 만들기로되어 있습니다. 그러나 목록 출력이나 'name by'필드 ('Sort by key : None')에서 볼 때 출력 목록의 날짜 값은 내 이름과 같은 내림차순이 아닌 알파벳 순서로 표시됩니다. 정렬. 내가 생각할 수있는 모든 조합을 시도했지만 "정렬"할 수는 없습니다.

$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