子类别 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数据库表中的表中显示子类别及其父类别

如何从 mysql 将子类别加载到 joomla

类别的递归数组和子类别 PHP

处理类别和子类别 MySQL 或 JSON

逻辑上选择类别和子类别(php,joomla,javascript,ajax)

PHP 从类别归档中排除子类别