我正在制作数据包类型系统在我的数据包表中,父数据包(id
是主键)及其N-Sub数据包在(parent_id
)之下存储,下面是我的表结构:
Packet_table
id | packet_name | parent_id |
------------------------------
1 | 01 | 0
2 | 02 | 0
3 | 03 | 1
4 | 04 | 1
5 | 05 | 1
6 | 06 | 4
7 | 07 | 4
8 | 08 | 3
9 | 09 | 5
10 | 010 | 2
........................so on and on with N packets in same table
以下是我尝试但未正确获取 id
N子包详细信息的内容:
SELECT p.`packet_name` AS MAIN, s.`packet_name` AS SUB
FROM packet_table s
LEFT JOIN packet_table p ON s.`parent_id` = p.`id`
如上表所示: id (主要/自动增量)
id = 1 - >主分组(01),其子分组和N个子分组是:
01 - > 03,04,05
04 - > 06,07
03 - > 08
05 - > 09
简而言之
01 -> 03 -> 08
04 -> 06 , 07
05 -> 09
它没有必要上面的设计格式mysql代码..只需要简单的N子包查询就可以了
以上只是少数,但在我的情况下,每个(id)将有N个子数据包。
注意:它可以和Category和N子类别相同,也请注意如上所述我不希望查询如上所述(作为树)..我只需要mysql以任何格式查询..
1}只需要当我用id = 1搜索时,结果会给我所有的子包和它的N个子包,
2}当我用任何子包id搜索时,它的结果应该给我它的子包和它的所有N子包,依此类推......也就是这个子包是哪个主包和vise诗歌。
更新:请查看以下格式查询我需要一些N个数据包
Table Format 1 : thats Main Packet
+------------+------------+----------+
| Main Pkt | Sub Packet | COUNT(*) |
+------------+------------+----------+
| 01 | 03 | 1 |
| 01 | 04 | 1 |
| 01 | 05 | 1 |
--------------------------------------
第二名:
Table Format 2 : thats Sub and Its N sub Packet
+------------+------------+-----------------+
| Main Pkt | Sub Packet | N Sub Packet |
+------------+------------+-----------------+
| 01 | 03 | 08 |
| 01 | 04 | 06 |
| 01 | 04 | 07 |
| 01 | 05 | 09 |
---------------------------------------------
第三:
Table Format 2 : thats Sub and Its N sub Packet
+------------+------------+-----------------+
| Main Pkt | Sub Packet | N Sub Packet |
+------------+------------+-----------------+
| 01 | 03 | 08 |
| 01 | 04 | 06 |
| 01 | 04 | 07 |
| 03 | 011 | 014 | -- *****
---------------------------------------------
above ***** : here 03 is actually sub packet of 01 hence it query will also help me
所以01 - 03 - 011 - 014
答案 0 :(得分:1)
为了能够在一个查询中获取所有子项,您可以重组表,以便将数据包数据存储为nested-set model。
根据您的数据样本构建的树结构:
0
/ \
1 2
/ | \ \
3 4 5 10
| |\ \
8 6 7 9
表:
+-------+--------------+-----+-----+
| id | packet_name | lft | rgt |
+-------+--------------+-----+-----+
| 0 | 00 | 1 | 22 |
| 1 | 01 | 2 | 17 |
| 2 | 02 | 18 | 21 |
| 3 | 03 | 3 | 6 |
| 4 | 04 | 7 | 12 |
| 5 | 05 | 13 | 16 |
| 6 | 06 | 8 | 9 |
| 7 | 07 | 10 | 11 |
| 8 | 08 | 4 | 5 |
| 9 | 09 | 14 | 15 |
| 10 | 010 | 19 | 20 |
------------------------------------
获取具有根01
:
SELECT node.packet_name
FROM Packet_table AS node,
Packet_table AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.packet_name = '01'
ORDER BY node.lft;
输出:
01, 03, 08, 04, 06, 07, 05, 09
另一个解决方案是在PHP端有一个循环并递归地获取所有子节点(参见recursive function to get all the child categories)。