MySql和php子类别

MySql和php子类别,php,mysql,join,Php,Mysql,Join,我的子类别有问题 我想用1个sql查询在我的页面上显示: 第1类: 子类别1 次级类别2 子类别n 第2类: 子类别1 次级类别2 子类别n 第3类: 子类别1 次级类别2 子类别n 表架构: 类别 id | catname |说明 子类别 id |父项| id |猫名|描述 目前,我正在使用一个类别查询,并在PHP while循环中使用另一个子类别查询,但这在一个页面上给了我很多查询我们需要查看您的表模式以提供适当的评论,但您可以做的是在一个查询中将子类别与

我的子类别有问题

我想用1个sql查询在我的页面上显示:

  • 第1类:
    • 子类别1
    • 次级类别2
    • 子类别n
  • 第2类:
    • 子类别1
    • 次级类别2
    • 子类别n
  • 第3类:
    • 子类别1
    • 次级类别2
    • 子类别n
表架构:

  • 类别
    • id | catname |说明
  • 子类别
    • id |父项| id |猫名|描述

目前,我正在使用一个类别查询,并在PHP while循环中使用另一个子类别查询,但这在一个页面上给了我很多查询

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

在没有看到表格的情况下,您可能需要以下内容:

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

树结构不需要两个表,标准的树结构表模式可以是:

categories
id | catname | description | parent | lineage
沿袭将包含返回根类别的路径,例如“0,2,5,6”父级将包含6

然后,对于您的问题,您可以按长度(沿袭)ASC从该表中选择全部

从数据库中获得结果集后,您可以根据它们的id对它们进行索引

$categories = array();
while($row = mysql_fetch_assoc($result)){
   $categories[$row['id']] = $row;
}
现在,当您在html中循环它们时,您可以检查当前类别是否有任何子类别

沿袭用于查找作为某个类别的后代的所有类别:

SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]'
从沿袭REGEXP'[[::]]所在的类别中选择*

这将获得沿袭中有5个类别的任何类别。

您应该获得所有类别和所有子类别。大概是这样的:

$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中做任何你想做的事情。只有两个查询。

与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 

类别
函数切换(){
var类别=”;
var ele=document.getElementById(类别);
var text=document.getElementById(“displayText”);
如果(ele.style.display==“块”){
ele.style.display=“无”;
}
否则{
ele.style.display=“块”;
}
} 

这只给出了每个类别的第一个子类别。在PHP中你会怎么做?@bisko:我完全同意。考虑到这个问题,我认为最好给出最短但仍然可用的答案,而不是进行必要的更改…这是一些事情,但是结构已经设置好了,所以现在更改DB结构是不可能的
 <? 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>