子类别 MySql 和 php
Posted
技术标签:
【中文标题】子类别 MySql 和 php【英文标题】:Subcategories MySql and php 【发布时间】:2010-11-22 05:22:49 【问题描述】:我在子类别方面遇到问题。
我想用 1 个 sql 查询在我的页面上显示这个:
类别 1: 子猫 1 子猫 2 ... 子猫 n 类别 2: 子猫 1 子猫 2 ... 子猫 n 类别 3: 子猫 1 子猫 2 ... 子猫 n ...表架构:
分类 标识 |猫名 |说明 子类别 标识 | parent_id |猫名 |说明目前我正在对类别使用查询,并在 php while 循环中对子类别使用另一个查询,但这在一个页面上给了我很多查询
【问题讨论】:
【参考方案1】: <? include('qry/viewJobs_qry.php'); ?>
<table class="tableFontSize">
<TR>
<TD>
</a>Category
</TD>
</TR>
</table>
<?php
if(!empty($viewJobs))
while($dataJobs=mysql_fetch_array($viewJobs))
$category = $dataJobs[jobNumber];
?>
<script language="javascript">
function toggle<? echo $category; ?>()
var category = "<? echo $category; ?>";
var ele = document.getElementById(category);
var text = document.getElementById("displayText");
if(ele.style.display == "block")
ele.style.display = "none";
else
ele.style.display = "block";
</script>
<table class="tableFontSize">
<TR>
<TD>
<a id="displayText" href=javascript:toggle<? echo $category; ?>();>+ </a><? echo $category; ?>
</TD>
</TR>
<TR>
<TD>
<span id="<? echo $jobNumber; ?>" style="display: none;"><div id="width900"><? include('subCategoryArray.php'); ?> </div></span>
</TD>
</TR>
</table>
<? ?>
</table>
【讨论】:
【参考方案2】:类似于 Zed 的答案,但从表子类别中选择,然后加入类别:
SELECT categories.name, subcategory.name
FROM subcategory
JOIN categories
ON category.id = subcategory.category_id
ORDER BY category.id, subcategory.id
这将返回成对的值,例如 (category 1, sub cat 1), (category 1, sub cat 2) ... 对于更多列,请将它们添加到语句中,并在适当的时候创建别名,例如
SELECT categories.name AS maincat_name,
subcategory.name AS subcat_name, subcategory.id AS subcat_id
【讨论】:
【参考方案3】:您应该获得所有类别和所有子类别。像这样的:
$sql = '
SELECT * FROM categories ORDER BY id ASC
';
$result = mysql_query($sql);
$categories = array();
while ($row = mysql_fetch_array($result))
$categories[$row['id']] = $row;
// get the subcategories
$sql = '
SELECT * FROM subcategories ORDER BY id ASC
';
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result))
$categories[$row['parent_id']]['subcategories'][] = $row;
print_r($categories);
这会将它们放在一个很好的数组结构中,您可以在 PHP 中做任何您想做的事情。而且只有两个查询。
【讨论】:
【参考方案4】:树结构永远不需要两个表,标准的树表模式可以是:
categories
id | catname | description | parent | lineage
Lineage 将包含返回根类别的路径,例如'0,2,5,6' 父级将包含 6
那么对于您的问题,您可以从该表 ORDER BY LENGTH(lineage) ASC 中选择所有内容
从数据库中获得结果集后,您可以通过它们的 id 对它们进行索引
$categories = array();
while($row = mysql_fetch_assoc($result))
$categories[$row['id']] = $row;
现在,当您在 html 中遍历它们时,您可以检查当前类别是否有任何子类别。
Lineage 用于查找属于某个类别的所有类别的后代:
SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]'
这将获得其谱系中包含 5 的任何类别。
【讨论】:
是的,但是结构已经设置好了,所以现在改变数据库结构是不行的【参考方案5】:没有看到表格,您可能需要类似的东西:
SELECT category.name, subcategory.name
FROM categories
LEFT JOIN subcategory
ON subcategory.category_id = category.id
ORDER BY category.name, subcategory.name
【讨论】:
这只给了我每个类别的第一个子类别。你会如何在 PHP 中做到这一点? @bisko:我完全同意。鉴于这个问题,我认为最好给出最短但仍然可用的答案,而不是进行必要的更改......【参考方案6】:我们需要查看您的表架构以提供适当的批评,但您可以做的是将子类别连接到一个查询中的类别,按类别、子类别排序。每当您看到一个新类别时,您就知道是时候完成当前子类别列表并开始一个新类别了。
【讨论】:
以上是关于子类别 MySql 和 php的主要内容,如果未能解决你的问题,请参考以下文章
使用php在单个mysql数据库表中的表中显示子类别及其父类别