SQL获取带有子类别的类别

时间:2016-02-22 13:05:59

标签: php sql

您好我试图解决和谷歌搜索如何使用SQL类别和子类别进行排序来选择html元素。我没有找到任何对我有用的想法。我有一张表categories,它看起来像

id     name       parent
1      cat1       0
2      sub1       1
3      cat2       0
4      sub2       1

我的查询看起来像这样

SELECT `a`.*, `b`.* 
FROM `categories` AS `a`
LEFT JOIN `categories` AS `b` 
    ON `a`.`id` = `b`.`parent`
WHERE `a`.`parent` IS NULL  

但是它让我回到空阵列: - /请帮忙。

我想要这样的结果:

cat1
   sub1
   sub2
cat2

4 个答案:

答案 0 :(得分:0)

你得到一个空数组,用于过滤' null'。 将您的查询更改为

"SELECT a.*, b.* from `categories` as a left join `categories` as b on a.id = b.parent where a.parent = 0"

这应该可以解决问题。

答案 1 :(得分:0)

你可以轻松地在php上制作它。以一种可以使用当前数据模型轻松完成的方式,在函数中实现递归,该递归将从null开始接收父ID。

在普通的sql中,你的问题不是如何检索,而是首先如何存储数据。我的意思是,如果你想在一个SQL中执行它(否则你可以尝试一个存储过程)。

在普通的SQL中,有很多方法可以做到这一点。例如,最容易检索的是最难存储的。

将您的父ID存储在字符串中:

Id Name      node
1 Cat1.           1
2 Cat2.           2
3 subcat11.   1.1
4 Cat 3.          3
5 subcat12.   1.2
6 subcat21.   2.1

然后就是这样:

Select name,ID,node from table order by node

答案 2 :(得分:0)

$query = "SELECT a.*, b.* from `categories` as a left join `categories` as b on a.id = b.parent where a.parent=0";
return $db->select($query); 

enter image description here

答案 3 :(得分:0)

就像其他人所说的那样,我认为你应该重新考虑如何存储你的数据,否则它会更难获取,如上所述:

假设您正在使用MySql:

select
sub.id as id,
case 
    when sub.parent is null then sub.name 
    else concat('    ', sub.name)
end as category_name,
cat.name as subcategory_name,
sub.parent
from categories as cat
right outer join categories as sub
  on cat.id=sub.parent
where cat.parent is null or cat.parent='0'
order by sub.id, sub.name;

对于PostgreSQL:

select
sub.id as id,
case 
    when sub.parent is null then sub.name 
    else '    ' || sub.name
end as category_name,
cat.name as subcategory_name,
sub.parent
from categories as cat
right outer join categories as sub
  on cat.id=sub.parent
where cat.parent is null or cat.parent=0
order by sub.id, sub.name;

应输出如下内容:

Sample resultset

这样你就可以发送缩进的文本(并且你也得到了项目ID),这就是你想要填写的选项,我在猜测。从PHP结果集/数组中获取idcategory_name字段。