2017-09-16 202 views
0

我已經看到了這樣的幾個問題和這個變化,但我仍然困惑如何去做這件事。我在不同地區擁有不同的經銷商,並希望按地區列出一個長列表。循環父母記錄其次是孩子,父母和孩子等

西海岸
經銷商1
經銷商2
經銷商3

東海岸
經銷商1
經銷商2
經銷商3

等等...

我有一個數據庫表的地區列表和另一個表與經銷商列表。

經銷商表有一個列,其中包含來自地區表的地區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」,你應該se 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的問題是它給了我區域名稱,一個經銷商名稱,區域名稱,第二個經銷商名稱等。每個區域只應顯示一次,然後顯示該區域下面列出的所有經銷商 – user8463989

+0

,因爲您需要兩個循環。一個循環的地區的結果,一個循環經銷商的結果。 – Jeffrey

+0

只需在PHP代碼中檢查該區域發生變化並隨後採取行動即可。通過ORDER BY區域內的所有經銷商來到彼此之後,當地區發生變化時,可以顯示它。比序列化的SQL更高效。 – slaakso

0

爲了您的需要,您需要顯示該地區一次,而不是所有經銷商的列表。你正在做的是向每個經銷商也顯示該區域:因爲兩者都印在同一個循環中。

在這種情況下,使用連接並不合理,因爲您不需要每個經銷商都提供所有地區信息。

僞CODO:

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

編輯:奧凱...在循環中查詢不是英皇酒店建議..

$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