如何从Database,codeigniter Active记录中获取这些值

时间:2012-07-20 06:50:51

标签: mysql codeigniter activerecord data-structures

您正在使用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 = 1它是Fashoin,则它有两个孩子,Men's fashionWomen's fashionand men's fashionshirts的父值。

这是层次结构。它就像一个树形结构,并且达到N级,请帮帮我

enter image description here

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

例如: - 我正在通过prefernceID = 1而只获得Men's fashionWomen's fashion :(

请帮忙。提前谢谢

2 个答案:

答案 0 :(得分:0)

通过AR课无法做到这一点。试试这个:

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

(假设您使用MySQL)

答案 1 :(得分: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)

树级别为:

 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)