2017-09-16 199 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