2017-09-16 1 views
0

이 같은 몇 가지 질문을 보았습니다. 그러나 이것에 대한 변형은 있지만이 작업을 수행하는 방법에 대해서는 여전히 혼란 스럽습니다. 나는 다른 지역에있는 다른 상인이 있고 1 개의 긴 명부에있는 지구에 의하여 그 (것)들을 목록으로 나타내고 싶다.루프 부모 레코드 다음에 어린이, 부모 및 자식 등

서해안
대리점 1
대리점이
대리점 3

동부 해안
대리점 1
대리점이
대리점 3

등등 ...

지역 목록이있는 데이터베이스 테이블과 딜러 목록이있는 테이블이 있습니다.

대리점 테이블에는 regions 테이블의 지역 ID가 포함 된 열이 있으므로 테이블을 조인 할 수 있습니다.

$stmt = $link->prepare("SELECT `region_name`, `dealer_name` FROM `dealer_region` as `dr` INNER JOIN `dealers` as `d` ON dr.`id` = d.`region_id` GROUP BY `region_name`"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
$numRows = $result->num_rows; 
if($numRows > 0) { 
    while($row = $result->fetch_assoc()) { 
     $dealer_name = $row['dealer_name']; 
     $region_name = $row['region_name']; 
     echo $region_name . "<br />" . $dealer_name . "<br />"; 
    } 
} 

$stmt->close(); 

그러나 한 대리점에서이 결과 만이 아니라 모든 각 지역에 따라 표시되는 :

나는이 시도.

답변

2

"GROUP BY region_name"대신 구역 이름으로 ORDER BY. GROUP BY는 집계 함수 (SUM, MIN, MAX, COUNT ...)에서만 사용해야합니다. ORDER BY를 사용하면 지역별로 딜러를 얻을 수 있습니다. 코드에

약간의 수정은 포함 :

$stmt = $link->prepare(" 
SELECT region_name, dealer_name 
FROM dealer_region as dr 
    INNER JOIN dealers as d ON dr.id = d.region_id 
    ORDER BY region_name 
"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
$numRows = $result->num_rows; 
$region_name = null; 

if($numRows > 0) { 
    while($row = $result->fetch_assoc()) { 
    if (is_null($region_name) || $region_name != $row['region_name']) { 
     $region_name = $row['region_name']; 
     echo '<b>' . $region_name . '</b><br>'; 
    } 
    echo $row['dealer_name'].'<br>'; 
    } 
} 

$stmt->close(); 
+0

ORDER BY를 사용할 때의 문제점은 지역 이름, 한 딜러 이름, 지역 이름 다시, 두 번째 딜러 이름 등을 제공한다는 것입니다. 각 지역은 두 번 반복해야하기 때문에 한 번만 표시 한 다음 해당 지역 아래 나열된 모든 딜러 – user8463989

+0

을 표시해야합니다. 하나는 지역의 결과를 반복하는 것이며, 하나는 딜러의 결과를 반복하는 것입니다. – Jeffrey

+0

지역 코드가 바뀔 때 PHP 코드를 체크 한 다음 실행하면됩니다. ORDER BY를 사용하면 해당 지역의 모든 딜러가 서로 후원되며 지역이 변경되면이를 표시 할 수 있습니다.직렬화 된 SQL보다 훨씬 효율적입니다. – slaakso

0

원하는대로 지역을 한 번 표시하고 모든 딜러 목록을 표시해야합니다. 당신이하고있는 일은 지역별 상인에게도 보여주고 있습니다 : 둘 다 같은 루프에 인쇄되기 때문입니다.

각 딜러마다 모든 지역 정보가 필요하지 않기 때문에 이러한 상황에서는 조인을 사용하는 것이 실제로 의미가 없습니다. 의사 코도에

:

Select * from dealer_region 
Loop over the results 
    echo $regionname 
    Select * from dealers where region_id = $dealerID 
    Loop over the results 
     echo $dealername 

편집 : 해두 ... 루프 내부 쿼리가 EEH하지 않습니다 .. 당신은, 당신은 하나 개의 쿼리를 필요로 할 경우에

$stmt = $link->prepare("SELECT * FROM `dealer_region`"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while($row = $result->fetch_assoc()) { 
    $regions[ $row['id'] ] = $row; 
} 
$stmt->close(); 

$stmt = $link->prepare("SELECT * FROM `dealers` ORDER BY `region_id`"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while($row = $result->fetch_assoc()) { 
    $dealers[ $row['region_id'] ][ $row['id'] ] = $row; 
} 
$stmt->close(); 

foreach($dealers AS $regionID => $dealers_) 
{ 
    echo '<b>'.$regions[ $regionID ].'</b>'; 
    foreach($dealers_ AS $dealerID => $dealer) 
    { 
     echo $dealer['dealer_name']; 
    } 
} 

을 권장 3 루프 ...

$stmt = $link->prepare("SELECT `region_name`, `dealer_name` FROM `dealer_region` as `dr` INNER JOIN `dealers` as `d` ON dr.`id` = d.`region_id`"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while($row = $result->fetch_assoc()) { 
    $data[ $row['region_name'] ][] = $row; 
} 
$stmt->close(); 

foreach($data AS $regionName => $dealers) 
{ 
    echo '<b>'.$regionName .'</b>'; 
    foreach($dealers AS $dealer) 
    { 
     echo $dealer['dealer_name']; 
    } 
} 
+0

는 SQL 불필요한 쿼리를 만드는 때문에 사용하지 않는 것이 좋습니다 직렬화. 하나의 쿼리만으로 모든 작업을 수행 할 수 있습니다. – slaakso

관련 문제