我想根据已选择的行中的值从我的数据库中的连接表中选择行。基本上,如果父行或祖父行处于事件状态,则还包括结果中的子行或孙行。
我曾尝试使用 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
都包含在内,因为它们的祖 parent 的状态为 goal
。 B
及其子目标和孙目标不包括在内,因为 memberObjectives
表中没有状态为 的
或B
完成目标
。
我最近的尝试如下:
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
感谢您提供的任何帮助!
最佳答案
无法测试,但试试这个:
SELECT mo.objective, mo.member, o.name, mo.status
FROM objectives AS o
LEFT JOIN memberObjectives o.id=mo.objetive
WHERE status='goal' or status='complete'
OR o.id IN(select parent from objetives o inner join memberObjectives mo on o.parent=mo.objetive WHERE status='goal' or status='complete')
这应该为您提供状态为 goal 或 complete 的记录,以及谁的父级拥有该记录。我不由你把它延伸到祖父。希望对您有所帮助。
关于MySQL:根据已选行中的值选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800887/