我正在制作包类型系统,其中在我的包表中存储父包(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/

10-11 11:56