【问题标题】:how to get these values from Database, codeigniter Active record如何从数据库中获取这些值,codeigniter 活动记录
【发布时间】:2012-07-20 06:50:50
【问题描述】:

嗨,我正在使用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层,请帮帮我

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

ex :- 我正在传递 prefernceID = 1 并且只得到 Men's fashionWomen's fashion :(

请帮忙。提前谢谢

【问题讨论】:

标签: mysql codeigniter activerecord data-structures


【解决方案1】:

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

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

(假设你使用 MySQL)

【讨论】:

  • 实际上 OP 要求获取 1 的子子子项,即从上述数据中包含 ID 1 的“衬衫”。
【解决方案2】:

也许你应该使用 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)

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2020-01-03
    • 2012-12-06
    • 2013-03-27
    • 2018-06-13
    相关资源
    最近更新 更多