有没有人知道如何使用一个查询而不是嵌套查询来创建此过程。基本上我正在尝试在下拉菜单中的主类别中获取子类别。我一直在讨论它很长时间,但是现在我只是使用这个嵌套循环因为我无法想出另一种方式。 谢谢!
<ul role=menu>
<?php
$statement = $database->prepare("SELECT * FROM category");
$statement->execute();
while($category = $statement->fetch(PDO::FETCH_ASSOC))
{
?>
<li><a href='<?php echo '/'.urlencode($category['name']);?>.html'><?php echo $category['name']; ?></a>
<ul>
<?php
$stmt = $database->prepare("SELECT * FROM area WHERE belong_to_category = :category_name");
$stmt->execute(array(':category_name' => $category['name']));
while($sub_category = $stmt->fetch(PDO::FETCH_ASSOC))
{
?>
<li role="menuitem"><a href='<?php echo '/'.urlencode($sub_category['name']);?>.html'><?php echo $sub_category['name'];?></a>
<?php
}
?>
</ul>
</li>
<?php
}
?>
</ul>
答案 0 :(得分:1)
您可以在查询语句中结合使用简单的JOIN来使用此处所述的PDO fetch PDO::FETCH_GROUP
。
反过来,您将获得类别作为键,然后相应的值是子类别。
您尚未发布任何数据库架构,因此我只举一个通过密钥加入它们的示例。
基本理念:
SELECT
T1.[role],
Value = coalesce(max(nullif(T2.value,'DEFAULT')),'DEFAULT')
FROM
@temp T1
JOIN @temp2 T2 ON COALESCE(T2.[role], T1.[role]) = T1.[role]
group by
T1.[role]
;
编辑。另一种方法是手动构建阵列。仍然使用相同的查询语句但不使用$sql = '
SELECT category.name AS category_name, area.name AS area_name FROM category
JOIN area ON area.category_id = category.id
'; // just a simple join
$statement = $database->prepare($sql);
$data = $statement->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
// use the `PDO::FETCH_GROUP` flag
// this turns the fetched data into a grouped one
// ul
foreach($data as $category => $sub_categories) {
// li
echo $category; // category name
// ol
foreach($sub_categories as $s) {
// li
echo $s['area_name']; // the area name
// close li
}
// close ol
// li close
}
// ul close
// Just fetch the necessary depth, this is just an idea
。
沿着这些方向:
PDO::FETCH_GROUP