我在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查询获取这些数据?
答案 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中操纵所有这些。