循环父母记录其次是孩子,父母和孩子等
我已经看到了这样的几个问题和这个变化,但我仍然困惑如何去做这件事。我在不同地区拥有不同的经销商,并希望按地区列出一个长列表。循环父母记录其次是孩子,父母和孩子等
西海岸
经销商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();
但是,这不仅导致一个经销商正在各区域而不是所有项下。
而不是“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();
为了您的需要,您需要显示该地区一次,而不是所有经销商的列表。你正在做的是向每个经销商也显示该区域:因为两者都印在同一个循环中。
在这种情况下,使用连接并不合理,因为您不需要每个经销商都提供所有地区信息。
伪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'];
}
}
序列化SQL使不必要的查询,因此不推荐使用。您可以使用单个查询完成所有操作。 – slaakso
使用ORDER BY的问题是它给了我区域名称,一个经销商名称,区域名称,第二个经销商名称等。每个区域只应显示一次,然后显示该区域下面列出的所有经销商 – user8463989
,因为您需要两个循环。一个循环的地区的结果,一个循环经销商的结果。 – Jeffrey
只需在PHP代码中检查该区域发生变化并随后采取行动即可。通过ORDER BY区域内的所有经销商来到彼此之后,当地区发生变化时,可以显示它。比序列化的SQL更高效。 – slaakso