我将记录存储在层次结构中。 例如。
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
的帐户遵循第二层级。
我需要获取给定级别的记录。 前任。
- 获取id=1的账号下的所有设备
- 获取属于 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/