mysql - 加入MySQL中的查询问题

标签 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 的帐户遵循第一个层次结构;而 ID 为 2 的帐户遵循第二层级。

我需要获取给定级别的记录。 前任。

  1. 获取id=1的账号下的所有设备
  2. 获取属于 id = 200 的部门和 id = 2 的帐户的所有设备 等等。

我可以通过如下查询检索这些内容:

第一个查询:

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 级别)。

最佳答案

这是一种糟糕的数据存储方式。

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

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

然后就可以正常jion了。其他一切都需要动态迭代选择,这不是 mysql 内置的,需要使用外部程序或手动完成。

不过,您可以编写一个脚本来为每个父类型和子类型动态生成一个表。

关于mysql - 加入MySQL中的查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27016845/

相关文章:

php - 带有链接和 ID 的调用行

php - 在单个 php 脚本上运行多个 php 脚本

mysql - 如何从现有数据创建新的逗号分隔列?

python - 在 python pandas 中迭代多索引数据

PHP MySQL层次结构数据优化

php - SQL/PHP 创建数据库并加载 .CSV

mysql - 仅为搜索目的创建新字段是一种不好的做法吗?

c# - 如何将 leftouterjoin 查询转换为 LINQ

mysql - 计算sql中不同的值

algorithm - 如何索引分层数据?