2010-03-07 7 views
0

데이터를 올바르게 정렬하는 방법에 대한 새로운 질문을 게시하도록 요청 받았습니다. 여기 내가하려는 일이 있습니다. 이 페이지에 필요한 모든 데이터를 데이터베이스로 한 번 여행하길 원합니다. 데이터가 데이터베이스에서 반환되면이를 정렬하여 사용해야합니다.데이터베이스 결과를 올바르게 정렬하는 방법

간략히하기 위해 나는 한 줄의 데이터만을 게시하고 있습니다. 실제로 8 행이 리턴됩니다. 반환되는 데이터의 구조는 다음과 같습니다.

col1 col2 col3 col4 col5 col6 col7 col8 col9 

이제 내가 가지고있는 문제가 있습니다. 1 ~ 7 열은 1 : 1 데이터 집합을 보유합니다. 그러나 열 8과 9는 수많은 행을 가지므로 총 8 개의 행이 있습니다. 1에서 7까지의 열이 1 : M 행과 섞여 있기 때문에 필자는 필자가 필요로하는 것보다 7 ~ 7 배의 행을 반향시키고있다.

어떻게 해결할 수 있습니까?


이 쿼리에는 4 개의 내부 조인이 사용됩니다. 테이블 중 하나는 한 번 액세스해야하는 페이지 관련 데이터를 보유합니다. 다른 조인은 다른 행을 작성하는 것입니다. 이 결과 집합의 결과가 절대적으로 맞다고 말하겠습니다. 정렬하는 방법을 알아 내야합니다.


OK,이 감각이 세트 ....

dealerId empId lotId rackId porterId vehicle vin 
1   1  1  1  1   Geo  12JI997676JH 
1   1  1  1  1   Ford  87HJ879854HS 
1   1  1  1  1   BMW  567876HCS456 
1   1  1  1  1   Mercedez 1JI8787GS687 

통지 I 데이터를 반복하는 4 개 행이 있는지 확인한다. 내가 필요한 것은 이것이다 :

dealerId empId lotId rackId porterId 
1   1  1  1  1 

다음 여러 행을 위해, 나는이 필요합니다

vehicle vin 
Geo  12JI997676JH 
Ford  87HJ879854HS 
BMW  567876HCS456 
Mercedez 1JI8787GS687 

그래서,이 설정은 지금 지금 내 딜러 데이터와 I의 나에게 단일 행을 제공을 차량 데이터가 포함 된 새로운 배열이 있어야합니다. :)

+0

한 걸음 더 나아가 테이블 구조, 실제 행 *의 샘플 행 및 사용중인 쿼리를 게시 할 수 있습니까? "열 8과 9 열에는 수많은 행이 있습니다."라는 말이 그 자체로는별로 의미가 없습니다. – deceze

+0

먼저 원하는 출력 형식을 결정해야합니다. 반복되는 데이터를 반환하려면 표 구조 ** **가 필요합니다. 그리고 그것을 어떻게 처리 할 것인가는 당신에게 달려 있습니다. group_concat 또는 루프의 조건을 사용할 수 있습니다. 그러나 먼저 원하는 출력 형식을 결정해야합니다. –

+0

이 경우 group_concat이 작동하지 않습니다. Deceze는 이미 그것을 위해 나를 노렸다. :) – jim

답변

1

좋아요, 질문은 어떻게됩니까?이 데이터를 어떻게 사용 하시겠습니까? 이 방식으로이를 표시 할 경우, 차량 당 하나의 행, 데이터가 가입 가져오고 그냥 통과하는 것이 합리적이다 :

foreach ($row as $vehicle) { 
    echo "$vehicle[vehicle] … $vehicle[dealerId]\n"; 
} 

각 검색 행에 관련된 하나 개의 데이터 집합을 의미한다.

OTOH, JOINed 차량 데이터가 dealerIds 등을 통해 실제로 많이 할 필요가없는 경우 별도의 쿼리에서이 두 가지를 검색하는 것이 훨씬 더 합리적입니다. 아마 더 빠를 것입니다.

가장 간단한 방법으로 데이터를 검색 (및 저장, 시작)하면 가능하면 PHP 코드에서 가능한 적은 포스트 마스킹을해야합니다. 이라는 목표를 "단일 쿼리에서 모든 항목 검색"으로 설정하지 마십시오. 데이터베이스에 대한 여러 번 방문하는 것이 너무 비싸다는 것을 두려워하면 아마 그렇지 않을 수도 있습니다. 시간은 두 번째 요청을하는 데 걸리는 시간보다 훨씬 더 중요합니다.

+0

예. 벽에 머리를 대고있어 가장 빠른 방법이 무엇인지 알아 내려고 노력했기 때문에 나는 다시 당신에게 완전히 동의해야합니다. Fireeyedboy는 또한 데이터베이스에 대한 여러 번의 여행을 제안했습니다. 이것이 내 최선의 길일 것 같아. 귀하의 질문에 대답하기 위해, 나는이 데이터를 얻을 수 없을 것입니다 이유는 두 가지 여행입니다. Deceze에 많은 도움을 주셔서 감사합니다. – jim

+0

@jim http://www.codinghorror.com/blog/2005/01/micro-optimization-and-meatballs.html :) – deceze

+0

고마워요! 나는 지금 거기에 갈거야. :) – jim

1

내가 알고있는 두 가지 옵션 (데이터 세트가 얼마나 큰지에 따라 사용).

다음 중 하나를
는 지금처럼, 모든 행을 취득하고, 같은과, PHP와 함께 분류 :

$result = array(); 
foreach($rowset as $row) 
{ 
    // if the parent row is not present in the result array (assuming col1 is PK) 
    if(!isset($result[ $row[ 'col1' ])) 
    { 
     // create it, and make arrays of col8 and col9 
     $result[ $row[ 'col1' ] ] = array(
      'col1' => $row[ 'col1' ], 
      'col2' => $row[ 'col2' ], 
      'col3' => $row[ 'col3' ], 
      'col4' => $row[ 'col4' ], 
      'col5' => $row[ 'col5' ], 
      'col6' => $row[ 'col6' ], 
      'col7' => $row[ 'col7' ], 
      'col8' => array($row[ 'col8' ]), 
      'col9' => array($row[ 'col9' ]) 
     ) 
    } 
    else 
    { 
     // the parent row is present, so push values in col8 and col9 arrays 
     $result[ $row[ 'col1' ] ][ 'col8' ][] = $row[ 'col8' ]; 
     $result[ $row[ 'col1' ] ][ 'col9' ][] = $row[ 'col9' ]; 
    } 
} 

또는 :
먼저를 선택하여 데이터베이스에 더 많은 여행을하십시오 결합되지 않은 행 및 이러한 행을 반복하고 이들 행에 대한 하위 행을 선택하십시오.

이렇게 결론을 내리면 : DB에 한 번만 여행하려는 경우 첫 번째 옵션 만 사용할 수 있습니다 (알고있는 한).

는 PS :
다른 옵션은 아마 프로 시저 또는 뷰를 저장 될 것이다,하지만 난 당신이 그 좋은 예, 특히 뷰를 제공하기 위해 그들과 충분한 경험이없는 (심지어 확실 뷰는 다음에 사용할 수 있습니다 목적).

그러나 저장 프로 시저의 이점은 DB에 대한 단일 여행 일 것입니다.

+0

fireeyedboy, 감사합니다. 이것은 정확하게 내가하고있는 일에 대해 생각하고 있었지만 그것이 정확했는지 또는 심지어 그것을 처리하는 가장 좋은 방법인지 확신 할 수 없었습니다. – jim

+0

@jim : 최근에 여러 쿼리에 더 의존하기 시작했습니다. 나는 DB에 대한 한 번의 여행이 더 좋은 방법이라고 생각했지만, 결과 집합이 커지면 PHP를 구문 분석 할 때 PHP가 필요하기 때문에 이것이 더 이상 효율적이지 않은 것입니다. 어쨌든이 조숙 한 최적화를 고려하여 실행 시간에 실제로 영향을 미치기 전까지는 DB에 더 많은 여행을가하도록합니다. 더 많은 여행은 보통 당신이 준 지저분한 (IMO) PHP 예제보다 더 읽기 쉽습니다. 그래서 나는 그것이 당신에게 얼마나 중요한지, 한 번에 모든 것을 할 수 있는지, 실제로 그것이 유익한지를 생각해 보라고 제안하고자합니다. –

+0

글쎄, 나는 네가 옳았 기 때문에이 일로 너와 실제로있다. 예가 더러워졌지만 정확히 내가 그 일을 잘 수행하고있다. 나는 항상 가능한 한 부하 시간을 줄이기 위해 노력하고있다. 사실 데이터베이스에 여러 번 여행하는 것이 그렇게 나쁜 것은 아니라고 생각하는 다른 사람이 있다고 기쁩니다. 내 말은, 당신의 예를 살펴보면, 기본적으로 똑같은 것을 가지고 있고, 실제로 사용할 수있는 모든 것을 100 줄 넘게 가지고 있습니다. 그것은 정말 짜증나고 더 나은 방법이나 모범 사례를 찾도록 만드는 것이 었습니다. – jim

관련 문제