簡體   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