일반적으로 나에게 명백한 대답은 "여러 조인"입니다. 그러나 여기에 상황이 있습니다 : 나는 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);
하위 쿼리로 트릭을해야합니다 .... 테이블 구조 및 원하는 출력 게시 – Hackerman
"루프"의 몇 가지 예를 보여줍니다. 아마도 정리할 수있는 것들이있을 것입니다. 수만 개의 항목은별로 많은 항목이 아닙니다. 대부분의 프로세서는 요즘 초당 수십억 개의 사이클을 수행합니다. –
추가 된 정보. – fruitcup