将循环查询简化为一个查询

时间:2011-09-02 16:14:12

标签: php mysql sql

我有一张表格,列出了不同级别的类别。我正在使用列 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个级别。

2 个答案:

答案 0 :(得分:1)

如果您希望能够运行一个查询并获得所有结果,您可能需要考虑将表结构更改为以下内容:

http://www.sitepoint.com/hierarchical-data-database-2/

添加或删除行时有点复杂,但会使搜索速度非常快。

答案 1 :(得分:0)

如果速度不是问题,你拥有的嵌套循环应该可以正常工作。但是如果你想避免递归或嵌套循环来获取类别和子类别,你可以创建一个新的列来映射一个类别的谱系。

示例:

  • 1
    • 2
      • 3
      • 4
        • 5
    • 6
      • 7
        • 8

对于类别5,血统的值将是

/1/2/4/5/

对于类别3,谱系的值将是

/1/2/3/

如果要查询类别2及其所有子类别,您的代码应如下所示:

$this->db->like('lineage', '/2/'); //Equivalent to WHERE lineage LIKE '%/2/%'

插入新类别可能会很麻烦,因为您需要另一个代码来生成血统。如果用户可以重新分配类别的父级,我不建议使用此解决方案,因为您需要为所有受影响的孩子重新生成血统。

相关问题