[英]Selecting from tables with many-to-many relationships
我有三个表,一个是问题,一个是预防措施,以及它们之间的链接之一(problem_pa)。 问题可能与多种行动联系在一起,而预防措施可能与多种问题联系在一起,即“多对多”关系。 我想要一条SQL语句,该语句允许我列出所有仍处于“打开”状态且在“打开”状态下没有任何预防措施的问题,即所有操作均已执行并关闭。 我正在搜索与已关闭操作有关的未解决问题(请参见下文):
SELECT p.id, p.slogan, p.state, pa.id, pa.slogan, pa.state
FROM problems p
JOIN problem_pa pp
ON p.id = pp.problem
JOIN preventative_actions pa
ON pa.id = pp.preventative_action
WHERE p.state = "Open" AND pa.state = "Closed"
但这只是让我感到困惑,因为多对多关系意味着这些问题可能仍然与他们有联系。 如何获得未解决的问题列表,没有剩余的未完成操作(仅已完成的操作)?
三个表:
这些行的问题(以及与该问题不相关的其他行):
id (int(11), AUTO_INCREMENT)
slogan (varchar(255))
state (enum ('Open', 'Closed')
与行(以及其他不相关的行)的preventative_actions:
id (int(11), AUTO_INCREMENT)
slogan (varchar(255))
state (enum ('Open', 'Closed')
问题_pa与行:
problem (int(11), to hold the id from the problems table)
preventative_action (int(11), to hold the id from the actions table)
问题中的样本数据:
1, Problem number 1, Open
2, Problem number 2, Open
3, Problem number 3, Closed
preventative_actions中的样本数据:
1, Action number 1, Open
2, Action number 2, Closed
3, Action number 3, Closed
issue_pa中的样本数据
1, 1
1, 2
2, 1
3, 2
3, 3
我希望搜索返回的是问题ID 3-这是唯一只有闭合动作链接的问题。 但是,搜索与闭合动作有关的问题将返回问题ID 1和3。我想我真正想要的是(与打开动作有关的问题)的反函数,在上面给出(ID 1和2)的反函数。例。
我遇到了与数据库中多达60个操作有关的问题,其中可能有55个现在已关闭而5个仍处于打开状态。 上面是一个简化,但我认为它包含所有相关数据。
此查询返回状态为“ 打开 ”, 没有打开的preventative_actions和至少一个关闭的preventative_actions的所有问题。
SELECT p.*
FROM problems p
INNER JOIN problem_pa pp ON pp.problem_id = p.id
INNER JOIN preventative_actions pa ON pa.id = pp.preventative_action_id
WHERE p.state = 'Open'
GROUP BY p.id
HAVING SUM(IF(pa.state = 'Open', 1, 0)) = 0 AND SUM(IF(pa.state = 'Closed', 1, 0)) > 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.