0

嗨,我正在使用codeigniter。我有一张这样的桌子。

PreferenceID | PreferencParentID |   Value
   1         |      0            | Fashion
   2         |      0            | music
   3         |      1            | Men's fashion
   4         |      1            | Women's fashion
   5         |      2            | Rock music 
   6         |      3            | shirts

如果我通过了PreferenceID = 1,我想获取记录Fashion,Men's fashion,Women's fashion,shirts

如果我通过了,PreferenceID = 2我想获得记录 music ,Rock music

  • 当我传递父 id 时,我想获取所有级别的所有子值。如果我通过PreferenceID = 1Fashoin,它有两个孩子,Men's fashion 并且Women's fashionand men's fashion是 的父值shirts

这是层次结构。它就像一个树形结构,有N层,请帮帮我

在此处输入图像描述

目前我正在做的是通过prefernceID 并获得所有下一个级别的孩子,

例如:-我只是通过 和prefernceID = 1获得:(Men's fashionWomen's fashion

请帮忙 。提前致谢

4

2 回答 2

0

没有办法通过 AR 类做到这一点。尝试这个:

$sql = 'SELECT `PreferenceID`, `PreferencParentID`, `Value`
        FROM `YourTableName`
        WHERE 1 IN(`PreferenceID`, `PreferencParentID`)';
$this->db->query($sql);

(假设你使用 MySQL)

于 2012-07-20T08:55:04.877 回答
0

也许您应该使用 MySQL 过程或适配器视图。

像您发布的示例数据:

mysql> create table treeNodes
    -> (
    ->  id int primary key,
    ->  nodename varchar(20),
    ->  pid int
    -> );
Query OK, 0 rows affected (0.09 sec) 
mysql> select * from treenodes;
+----+----------+------+
| id | nodename | pid  |
+----+----------+------+
|  1 | A        |    0 |
|  2 | B        |    1 |
|  3 | C        |    1 |
|  4 | D        |    2 |
|  5 | E        |    2 |
|  6 | F        |    3 |
|  7 | G        |    6 |
|  8 | H        |    0 |
|  9 | I        |    8 |
| 10 | J        |    8 |
| 11 | K        |    8 |
| 12 | L        |    9 |
| 13 | M        |    9 |
| 14 | N        |   12 |
| 15 | O        |   12 |
| 16 | P        |   15 |
| 17 | Q        |   15 |
+----+----------+------+
17 rows in set (0.00 sec)

树的层次是:</p>

 1:A
  +-- 2:B
  |    +-- 4:D
  |    +-- 5:E
  +-- 3:C
       +-- 6:F
            +-- 7:G
 8:H
  +-- 9:I
  |    +-- 12:L
  |    |    +--14:N
  |    |    +--15:O
  |    |        +--16:P
  |    |        +--17:Q
  |    +-- 13:M
  +-- 10:J
  +-- 11:K  

您可以创建一个函数 getChildLst 来获取包含所有子节点的字符串。

mysql> delimiter //
mysql>
mysql> CREATE FUNCTION `getChildLst`(rootId INT)
    -> RETURNS varchar(1000)
    -> BEGIN
    ->   DECLARE sTemp VARCHAR(1000);
    ->   DECLARE sTempChd VARCHAR(1000);
    ->
    ->   SET sTemp = '$';
    ->   SET sTempChd =cast(rootId as CHAR);
    ->
    ->   WHILE sTempChd is not null DO
    ->     SET sTemp = concat(sTemp,',',sTempChd);
    ->     SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0;
    ->   END WHILE;
    ->   RETURN sTemp;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> delimiter ;

然后我们可以使用 find_in_set 函数查找所有值:

mysql> select getChildLst(1);
+-----------------+
| getChildLst(1)  |
+-----------------+
| $,1,2,3,4,5,6,7 |
+-----------------+
1 row in set (0.00 sec) 

mysql> select * from treeNodes
    -> where FIND_IN_SET(id, getChildLst(1));
+----+----------+------+
| id | nodename | pid  |
+----+----------+------+
|  1 | A        |    0 |
|  2 | B        |    1 |
|  3 | C        |    1 |
|  4 | D        |    2 |
|  5 | E        |    2 |
|  6 | F        |    3 |
|  7 | G        |    6 |
+----+----------+------+
7 rows in set (0.01 sec)

mysql> select * from treeNodes
    -> where FIND_IN_SET(id, getChildLst(3));
+----+----------+------+
| id | nodename | pid  |
+----+----------+------+
|  3 | C        |    1 |
|  6 | F        |    3 |
|  7 | G        |    6 |
+----+----------+------+
3 rows in set (0.01 sec)
于 2012-07-20T12:21:34.600 回答