加入MySQL中的查询问题

时间:2014-11-19 12:28:07

标签: mysql sql hierarchical-data recursive-query

我将记录存储在层次结构中。 实施例

Account -> Hospital -> Department
Account -> Hospital -> Department -> Section

我以下列方式存储所有记录的关联。

+------+---------------+----------+---------------+-----------+
|  Id  |  ParentType   | ParentId |   Child Type  |  ChildId  |
+------+---------------+----------+---------------+-----------+
|     1|        account|         1|       hospital|         10|
|     2|        account|         1|       hospital|         20|
|     3|       hospital|        10|     department|        100|
|     4|       hospital|        10|     department|        101|
|     5|     department|       100|         device|       1000|
|     6|     department|       101|         device|       1001|
|     6|     department|       101|         device|       1002|
|     1|        account|         2|       hospital|         30|
|     2|        account|         2|       hospital|         40|
|     3|       hospital|        30|     department|        200|
|     4|       hospital|        40|     department|        201|
|     5|     department|       200|        section|       5000|
|     5|     department|       200|        section|       5001|
|     6|        section|      5000|         device|       2001|
|     6|        section|      5001|         device|       2002|
+------+---------------+----------+---------------+-----------+

因此,ID为1的帐户遵循第一层次结构;而标识为2的帐户遵循第二层次结构。

我需要获取给定级别的记录。 防爆。

  1. 获取属于id = 1
  2. 帐户的所有设备
  3. 获取属于id = 200的部门的所有设备和ID = 2的帐户 等等。
  4. 我可以通过以下查询检索这些:

    首先查询:

    SELECT a3.ChildType, a3.ChildId FROM association_lookup a1 -- [got hosp level]
     JOIN association_lookup a2 ON a2.parentId = a1.ChildId -- [got dept level]
     JOIN association_lookup a3 ON a3.parentId = a2.ChildId AND a3.ParentType = a2.ChildType -- [got device level]
    WHERE a1.ParentId = 1 AND a1.ParentType = 'account' 
     AND a3.ChildType = 'device'
    

    我可以将此作为动态查询,其自联接等于level difference - 1。即帐户级别= 0,设备级别= 3;因此有2个加入。

    但是现在,如果我想将设备与hospital级别而不是department级别相关联;像:

    |    xx|    hospital|        10|         device|       1003|
    

    然后对于相同的查询,将跳过此设备,并且仅返回与department级别关联的设备。如何获取所有设备(即hospital级和department级别)。

1 个答案:

答案 0 :(得分:1)

这是一种存储数据的可怕方式。

我建议重组并为每个实体创建单独的表。

即。创建表帐户,创建表医院......

然后你就可以了。其他一切都需要动态迭代选择,而不是内置于mysql中,需要通过外部程序或手工完成。

您可以编写一个脚本来动态生成每个父类型和子类型的表格。