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

时间:2009-07-23 06:03:26

标签: php sql mysql

我在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 个答案:

答案 0 :(得分:5)

不是一个真正的答案,但我过去在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);

答案 1 :(得分:3)

答案 2 :(得分:2)

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

$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; ?>

答案 3 :(得分:1)

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

如果您知道树的最大深度,您可以使用连接执行某些操作...如果不这样做,则会更难。

例如,您可以查看文章Managing Hierarchical Data in MySQL

如果你的表中只有几行,一个可能很好的解决方案就是“select *”,并在PHP中操纵所有这些。