循环父记录,后跟儿童,父母和子女等

时间:2017-09-16 13:28:32

标签: php mysql

我已经看过这样的一些问题以及这方面的变化,但我仍然感到困惑的是如何去做这件事。我在不同的地区有不同的经销商,并希望按地区列出一个长列表。

西海岸
经销商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 个答案:

答案 0 :(得分:2)

您应该使用ORDER BY region_name而不是“GROUP 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();

答案 1 :(得分:0)

根据您的需要,您需要显示一次该区域,而不是所有经销商的列表。你正在做的是每个经销商也显示该区域:因为两者都是在同一个循环中打印。

在这种情况下,使用联接并不合理,因为您不需要每个经销商提供所有地区信息。

in pseudo codo:

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

编辑: oke ...循环中的查询不是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'];
    }
}