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、2 つの子がMen's fashion あり、Women's fashion. and men's fashionの親値ですshirts

これが階層です。それはツリー構造のようなもので、N レベルに達します。助けてください

ここに画像の説明を入力

現在私が行っているのはprefernceID 、次のレベルのすべての子を渡し、取得することです。

ex :- 私は受け渡しprefernceID = 1と取得のみMen's fashion を行っており、Women'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 に答える