代码之家  ›  专栏  ›  技术社区  ›  amazedsaint

仅在一个SQL查询中检索所有类别、子类别、子类别等的完整列表

  •  4
  • amazedsaint  · 技术社区  · 6 年前

    我在MySQL中有如下表结构和数据

    CatID  CatName     ParentCatID
    -------------------------------
    1       Shirts        NULL
    2       Short Sleev    1
    3       Long Sleev     1
    4       Collarless     2
    5       Collar         2
    6       Collarless     3
    7       Collar         3
    8       Square Cut     4
    9       Round Cut      4
    10      Square Cut     6
    11      Round Cut      6
    

    我想要的返回数据如下:

    Shirts > Short Sleev
    Shirts > Long Sleev
    Shirts > Short Sleev > Collarless
    Shirts > Short Sleev > Collar
    Shirts > Long Sleev > Collarless
    Shirts > Long Sleev > Collar
    Shirts > Short Sleev > Collarless > Square Cut
    Shirts > Short Sleev > Collarless > Round Cut
    Shirts > Short Sleev > Collar > Square Cut
    Shirts > Short Sleev > Collar > Round Cut
    

    如何在MySQL中使用一个SQL查询来获取这些数据?

    4 回复  |  直到 16 年前
        1
  •  5
  •   Martin Bean    14 年前

    这并不是一个真正的答案,但我过去在PHP中使用的一个肮脏的修复程序是这样的:

    $categories = array();
    
    $sql = "SELECT CatID, CatName, ParentCatID FROM TableName";
    $res = mysql_query($sql);
    while ($row = mysql_fetch_assoc($res)) {
        $parent = intval($row['ParentCatId']);
        if (!isset($categories[$parent])) {
            $categories[$parent] = array();
        }
        $categories[$parent][] = $row;
    }
    

    这将为您提供一个类别和子类别的数组,您可以使用递归函数对其进行迭代。比如:

    function build_categories($parent, $categories) {
        if (isset($categories[$parent]) && count($categories[$parent])) {
            echo '<ul>';
            foreach ($categories[$parent] as $category) {
                echo '<li><a href="#">' . $category['CatName'] . '</a>';
                echo build_categories($category['id'], $categories);
                echo '</li>';
            }
            echo '</ul>';
        }
    }
    $menu = build_categories(0, $categories);
    
        3
  •  2
  •   Selvam AP    13 年前

    我需要这个有层次结构的下拉列表。。所以我使用了上面的代码并做了一些修改。结果符合我的要求。我想和你分享这个。

    $category_string = "";
    function build_categories_options($parent, $categories, $level) {
        global $category_string;
        if (isset($categories[$parent]) && count($categories[$parent])) {
            $level .= " - ";
            foreach ($categories[$parent] as $category) {
                $opt_value = substr($level.$category['CatName'],3);
                $category_string .= '<option value="'.$category['CatID'].'">'.$opt_value.'</option>';
                build_categories_options($category['CatID'], $categories, $level);
            }
            $level = substr($level, -3);
        }
        return $category_string;
    }
    $category_options = build_categories_options(0, $categories, '');
    $category_options = '<select name="sel_category" id="sel_category">'.$category_options.'</select>';
    

    然后使用echo语句打印页面中的任意位置。

    <?php echo $category_options; ?>
    
        4
  •  1
  •   Pascal MARTIN    13 年前

    我不认为MySQL支持树状结构(例如,与Oracle相反)。

    如果你知道你的树的最大深度,你可以用连接做点什么。。。如果你不这样做,那就更难了。

    你可以看看这篇文章 Managing Hierarchical Data in MySQL 例如。

    如果您的表中只有几行,一个潜在的好解决方案是 select * ,并在PHP中处理所有这些。

    推荐文章