我有一张表格,列出了不同级别的类别。我正在使用列 category_id , category_title , category_level 和 category_parent_id
以下代码是我的搜索脚本的一部分。对于搜索中的给定类别,我希望获得的结果不仅属于所选类别,还包括此类别的所有子类别(以及这些类别的子项等)。我通过循环这个类别的孩子然后是孩子们的孩子来解决它。
是否可以将其简化为一个查询?我希望得到一个由逗号分隔的所有子类别的字符串,以便我可以在WHERE IN
条件下使用它。
$categories = $this->input->get('category_id');
$subquery = $this->db->where('parent_id',$categories)->get('categories');
$subcats = $subquery->result();
foreach($subcats as $cat) {
$categories .= ','.$cat->category_id;
$subsubquery = $this->db->where('parent_id',$cat->category_id)->get('categories');
foreach($subsubquery->result() as $cat) {
$categories .= ','.$cat->category_id;
}
}
输出应该类似于2, 15, 45, 15, 41, 32
我正在使用活动记录查询btw(在CodeIgniter中),因为语法会让你感到困惑。我将在表中存储最多约50个类别,最多3个级别。
答案 0 :(得分:1)
如果您希望能够运行一个查询并获得所有结果,您可能需要考虑将表结构更改为以下内容:
http://www.sitepoint.com/hierarchical-data-database-2/
添加或删除行时有点复杂,但会使搜索速度非常快。
答案 1 :(得分:0)
如果速度不是问题,你拥有的嵌套循环应该可以正常工作。但是如果你想避免递归或嵌套循环来获取类别和子类别,你可以创建一个新的列来映射一个类别的谱系。
示例:
对于类别5,血统的值将是
/1/2/4/5/
对于类别3,谱系的值将是
/1/2/3/
如果要查询类别2及其所有子类别,您的代码应如下所示:
$this->db->like('lineage', '/2/'); //Equivalent to WHERE lineage LIKE '%/2/%'
插入新类别可能会很麻烦,因为您需要另一个代码来生成血统。如果用户可以重新分配类别的父级,我不建议使用此解决方案,因为您需要为所有受影响的孩子重新生成血统。