我正在制作数据包类型系统 在我的数据包表中,父数据包(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 verse。
更新:请检查下面的查询格式,我需要一些 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 |
------------------------------------
获取根为 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)。
关于php - Packet和N-SubPacket Sql查询(类目和N子类同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679157/