2017-09-16 17 views
0

私はこのようないくつかの質問を見てきましたが、これのバリエーションはありましたが、私はこれをやり遂げる方法としてまだ混乱しています。私はさまざまな地域に異なるディーラーを抱えていて、1つの長いリストに地域別にリストしたいと考えています。子ども、親、子どもなどが続くループ親レコード

西海岸
ディーラー1
ディーラー2
ディーラー3

東海岸
ディーラー1
ディーラー2
ディーラー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 region_nameです。 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を使用する際の問題は、地域名、1つのディーラー名、地域名、2番目のディーラー名などを教えてくれます。 2つのループが必要なため、各地域は1回だけ表示し、次にその地域の下に表示されているすべてのディーラー – 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 

編集:擬似codoで

おけば...ループ内のクエリが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クエリが不要になりますので、お勧めしませんシリアル化。 1つのクエリですべてを行うことができます。 – slaakso

関連する問題