繁体   English   中英

从具有多对多关系的表中选择

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM