您正在使用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
。
PreferenceID = 1
它是Fashoin
,则它有两个孩子,Men's fashion
和Women's fashion
。 and men's fashion
是shirts
的父值。 这是层次结构。它就像一个树形结构,并且达到N级,请帮帮我
目前我正在做的是传递prefernceID
并获得所有下一级别的孩子,
例如: - 我正在通过prefernceID = 1
而只获得Men's fashion
和Women's fashion
:(
请帮忙。提前谢谢
答案 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)