子类别 MySql 和 php

4
我有关子类的问题。
我想用一个SQL查询在我的页面上显示:
  • 类别1:
    • 子类1
    • 子类2
    • ...
    • 子类n
  • 类别2:
    • 子类1
    • 子类2
    • ...
    • 子类n
  • 类别3:
    • 子类1
    • 子类2
    • ...
    • 子类n
  • ...
表格模式:
  • 类别
    • id | catname | 描述
  • 子类
    • id | parent_id | catname | 描述
目前,我使用了一个针对类别的查询,在PHP while循环中使用另一个查询来获取子类别,但这会在一个页面上产生大量的查询。
6个回答

1
 <? include('qry/viewJobs_qry.php'); ?> 
 <table width="900" 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 width="900" 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>

1

对于树形结构,从来不需要两个表格,标准的树形表格模式可能是:

categories
id | catname | description | parent | lineage

Lineage将包含返回到根类别的路径,例如“0,2,5,6”,parent将包含6

然后对于您的问题,您可以从该表中选择所有内容,按长度(lineage)升序排序

在从数据库中获得结果集之后,您可以按其ID进行索引

$categories = array();
while($row = mysql_fetch_assoc($result)){
   $categories[$row['id']] = $row;
}

现在当你在HTML中循环遍历它们时,你可以检查当前类别是否有任何子类别。
血统用于找到某个类别的所有后代类别:
SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]'

这将获取任何祖先中包含5的类别。


那是一件好事,但结构已经设定,所以目前无法更改数据库结构。 - Bundy

1

你应该获取所有的类别和子类别。就像这样:

$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中自由处理数据。而且只需要两个查询。


0

没有看到表格,你可能需要类似这样的东西:

SELECT category.name, subcategory.name
FROM categories
LEFT JOIN subcategory
  ON subcategory.category_id = category.id
ORDER BY category.name, subcategory.name

这只给我每个类别的第一个子类别。你会如何在PHP中处理呢? - Bundy
@bisko:我完全同意。鉴于问题,我认为提供最短但仍可用的答案比深入讨论所需的更改要好。 - Zed

0

与Zed的答案类似,但是从子类别表中选择,然后连接类别:

SELECT categories.name, subcategory.name
FROM subcategory
JOIN categories
  ON category.id = subcategory.category_id
ORDER BY category.id, subcategory.id

这将返回如(类别1,子类1),(类别1,子类2)等一对值。如需更多列,请将其添加到语句中,并在适当的情况下进行别名设置,例如:

SELECT categories.name AS maincat_name, 
    subcategory.name AS subcat_name, subcategory.id AS subcat_id 

0
我们需要查看您的表结构才能提供适当的评论,但您可以在一个查询中将子类别与类别连接起来,按类别、子类别排序。每当您看到一个新类别时,就知道是时候完成当前子类别列表并开始一个新类别了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接