【发布时间】:2014-05-13 02:42:12
【问题描述】:
我想根据已选择的行中的值从数据库中的连接表中选择行。基本上,如果父行或祖父行处于活动状态,则还要在结果中包含子行或孙行。
我尝试使用 JOINS 和 UNIONS 的不同组合来获得我想要的结果,但没有成功。
这是我的示例数据:
表 1:目标 (可供成员设定为目标或完成的目标)
id | name | parent
---------------------------
A | Obj A | null
A1 | Obj A1 | A
A2 | Obj A2 | A
A2-1 | Obj A2.1 | A2
B | Obj B | null
B1 | Obj B1 | B
B1-1 | Obj B1.1 | B1
C | Obj C | null
C1 | Obj C1 | C
C1-1 | Obj C1.1 | C1
表 2:成员目标 (目标成员已经完成或设定为目标)
id | objective | member | status
-----------------------------------
1 | A | 001 | goal
2 | A1 | 001 | complete
3 | C | 001 | goal
所需结果: 连接两个表并选择状态为 goal 或 complete 或父或祖父目标状态为 goal 或 complete 的所有行。
objective | member | name | status
------------------------------------------
A | 001 | Obj A | goal
A1 | 001 | Obj A1 | complete
A2 | 001 | Obj A2 | null
A2-1 | 001 | Obj A2-1 | null
C | 001 | Obj C | goal
C1 | 001 | Obj C1 | null
C1-1 | 001 | Obj C1.1 | null
A2 和C2 被包括在内,因为他们的父母A 和C 的状态为goal 和A2-1 和C1-1 被包括在内,因为他们的祖父母的状态为@ 987654337@。不包括B 及其子目标和孙目标,因为memberObjectives 表中没有B 的状态为complete 或goal。
我最近的尝试,我知道还没有接近如下:
SELECT DISTINCT mo.objective, mo.member, o.name, mo.status
FROM objectives AS o
LEFT JOIN (SELECT * FROM memberObjectives
WHERE member = '001') AS mo ON o.id = mo.objective
LEFT JOIN objectives AS o2 ON o2.id = o.parent
LEFT JOIN objectives AS o3 ON o3.id = o2.parent
GROUP BY o.id
感谢您提供的任何帮助!
【问题讨论】:
-
如果您的 ID 是数字而不是 A、A1... 等,这将很容易。您只需要 A 吗?或者这只是你的例子?因为你可以从 A 中过滤掉。问题是祖父母不能只用加入来做
-
@JohnRuddell
As 仅用于示例。我可能想要获得所有具有goal或complete状态的As 和Cs,或者具有该状态的父母或祖父母,但不是任何Bs,因为该成员没有完成任何Bs 或将它们设置为目标。 -
我目前想知道是否有办法加入表格,所以我最终得到了两个额外的列
parentStatus和grandparentStatus,这样如果这些列中的任何一个或原始的 @ 987654353@ 列是goal或complete包含在结果中。 (WHERE status = 'goal' OR status = 'complete' OR parentStatus = 'goal' OR parentStatus = 'complete' OR grandparentStatus = 'goal' OR grandparentStatus = 'complete')
标签: mysql sql select join union