我正在制作包类型系统,其中在我的包表中存储父包(id
这是主键)及其n个子包(parent_id
),下面是我的表结构:
数据包表
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
下面是我尝试过但没有得到正确的子包详细信息:
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个子包。
注:可以是同一个类别和n个子类别类型,也请注意如上所述我不想查询如上所述(作为树)。我只需要任何格式的mysql查询。
1}只需要当我用id=1搜索时,结果会给我所有的子包和n个子包,
2}当我使用任何子包id进行搜索时,结果应该给出它的子包和它的所有n个子包等等。这个子包也是其中的主包和副包。
更新:请检查下面的查询格式我需要一些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
最佳答案
为了能够在一个查询中获得所有子项,可以重新构造表,使其将数据包数据存储为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 |
------------------------------------
获取具有根的子树的所有节点:
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)。
关于php - Packet和N-SubPacket Sql查询(与类别和N子类别相同),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25679157/