2013-04-25 2 views
0

일반적으로 나에게 명백한 대답은 "여러 조인"입니다. 그러나 여기에 상황이 있습니다 : 나는 tableA가있는 몇 천 개의 엔트리가있는 테이블을 가지고 있습니다. 수천 개의 항목이있는 또 다른 테이블 tableB가 있습니다. 각 항목에는 tableA에있는 행의 ID와 상관되는 번호가 있습니다. tableA에는 단일 행이있는 여러 행이 tableB에 있습니다. 수만 개의 항목이있는 세 번째 테이블 인 tableC가 있습니다. tableB의 단일 행에 해당하는 여러 행이 있습니다. 이 단지 벌금과 멋쟁이 작동합니다 (세부 사항은별로 중요하지 않습니다)여러 개의 MySQL 쿼리 또는 여러 개의 JOIN이있는 쿼리?

SELECT tableA.*, tableB.*, tableC.* LEFT JOIN tableB ON tableB.idA = tableA.id LEFT JOIN tableC ON tableC.idB = tableB.id WHERE tableA.id = some_number; 

,하지만 난 때문에 가입 중복 행의 톤을 얻을 :

쿼리는 다음과 같이 보일 수 있습니다. tableA에 대해 하나의 결과를, tableB에서 몇 가지 결과를, tableC에서 여러 결과를 원합니다.

불행히도이 작업을 수행하려면 많은 중첩 된 PHP 배열과 for 루프를 사용합니다. 지저분 해지기 때문에 모든 중첩 된 PHP 루프를 제거하기 위해 3 개의 개별 쿼리를 사용해야하는지, 아니면 JOINS를 사용해야하는지 궁금합니다.

추가 정보 : "TABLEA"작업 ID (기본 키) 이름 설명 날짜 시간 고객 상태

"TableB의"작업 ID (기본 키) 작업 (작업의 행 ID와 연관 됨) 요약 설명 날짜

,210

"tableC"시간 ID (기본 키) 작업은 말을

원하는 출력을 시작 (작업에서 행의 ID와 상관 관계) : 내가 가장 좋은 것입니다 어떤 종류의 포맷 정말 모르겠어요. 한 가지 작업 행과 함께가는 작업 목록 및 각 작업과 관련된 시간 목록이 필요합니다.

중첩 루프의 예 : $ work는 두 값을 갖는 배열입니다. 첫 번째는 작품의 배열이고, 두 번째는 일련의 작품입니다.

foreach ($work[0] as $workk=>$workv) { 
    echo("<div><h1>" . $workk . ": " . $workv["summary"] . "</h1><br/>Job: " . $workv["job"] . "</br>Date: " . $workv["date"] . "<br>Description:" . $workv["description"] . "<br/>Times:<br/>"); 
    foreach ($work[1] as $workid=>$times) { 
     if ($workid == $workk) { 
      foreach ($times as $time) { 
       echo("Start: " . $time[0] . " | End: " . $time[1]); 
      } 
      break; 
     } 
    } 
} 

내가 함수에서이 코드를 사용하여 "작업"배열을 얻을 당신은 두 * 방법이

foreach ($query->result() as $row) { 
       if (!array_key_exists($row->id, $work)) { 
        $work[$row->id] = array("job"=>$row->job, "summary"=>$row->summary, "description"=>$row->description, "date"=>$row->date); 
       } 
       $times[$row->id][] = array($row->start, $row->end); 
      } 
      return array($work, $times); 
+0

하위 쿼리로 트릭을해야합니다 .... 테이블 구조 및 원하는 출력 게시 – Hackerman

+0

"루프"의 몇 가지 예를 보여줍니다. 아마도 정리할 수있는 것들이있을 것입니다. 수만 개의 항목은별로 많은 항목이 아닙니다. 대부분의 프로세서는 요즘 초당 수십억 개의 사이클을 수행합니다. –

+0

추가 된 정보. – fruitcup

답변

1

($ 질의 -> 결과는() 긴 가입 쿼리에서 행입니다) DB를 쿼리하는 중 :

  1. 두 개의 왼쪽 조인과 함께 모든 데이터를 가져옵니다.
  2. 마스터 데이터를 가져 와서 주문 정보를로드하십시오.

* 별도로 모든 세 개의 테이블을로드하고 PHP에서 그들을 연결하는

첫 번째 방법은 처음에로드 조금 더 걸릴 수 있습니다 노력하지만, 데이터가로드되고 거기 의지하지 마십시오 더 이상 DB 호출이 아닙니다. 반면에 데이터를 표 (반복 마스터 포함)로 표시하기는 쉽지만 종종 원하는 UI가 아닙니다. 특수 UI 구성 요소를 사용하여 마스터 세부 정보를 자동으로 처리하지 않는 한 테이블을 좀 더 합리적인 형식 (이 경우 루프)으로 변환하는 데 어려움이있을 수 있습니다.

두 가지 수준의 마스터 세부 정보를 표시하는 방법으로 문제가 실제로 UI 디자인 문제입니다. 마스터 세부 정보를 표시하는 UI 패턴이 많이 있습니다.

예를 들어, 드롭 다운에서 첫 번째 수준 (표 A) 만로드하고 DB를 쿼리하고 드롭 다운 변경시 두 번째 수준을 표시 할 수 있습니다. 또는 구조 축소와 같은 쿼리를 수행하는 구조와 같은 트리를 가질 수 있습니다.

몇 가지 아이디어를 보려면 this link을보세요. PHP를위한 마스터 디테일 UI 컴포넌트를 검색 할 수도 있습니다.

+0

내 선택 사항과 기사를 설명해 주셔서 감사합니다. 나는 아직 내가 무엇을 할 지 확신하지 못한다. 그러나 이것은 일들을 맑게한다. – fruitcup

관련 문제