php - Packet和N-SubPacket Sql查询(类目和N子类同)

标签 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 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/

相关文章:

PHP mime 类型不适用于 MP3

php - 从数据库中检索数据不适用于此代码

php - MySQL - PHP - 用户 '' @'localhost' 访问数据库 'myproject' 被拒绝

sql - 具有多个多对多关系的数据库建模

database - 普通形式 - 第二与第三 - 区别只是复合键吗?非平凡的依赖?

ruby - 是否有打包在 Ruby gem 中的数据库或持久存储?

php - 我如何在 cakephp 3 的上下文中解决此 SQLSTATE 错误?

php - 将用户 ID 传递给嵌套查询

jquery - JSON格式转换

mysql - 如何获取mysql触发器创建或最后更新的时间?