我已经看过这样的一些问题以及这方面的变化,但我仍然感到困惑的是如何去做这件事。我在不同的地区有不同的经销商,并希望按地区列出一个长列表。
西海岸
经销商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();
但这只会导致一个经销商在每个地区展示,而不是全部。
答案 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'];
}
}