Packet和N-SubPacket Sql查询(与类别和N子类别相同)

时间:2014-09-05 05:30:51

标签: php mysql database join mysqli

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

1 个答案:

答案 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)。