2011-11-08 59 views
1

對不起,如果這之前已經回答;我有點不確定如何最好地描述這個問題,不必介意搜索它。但在這裏...MySQL子查詢AND'NOT IN'

基本上我有一個'項目'表,它擁有'id'和'標題'。我還有一個'projects_history'表,當(IF)項目設置爲歸檔(布爾值)時,該表保存信息。它有一個引用項目的'pid'鍵 - 每更新一個項目可以有多個記錄(以便跟蹤誰設置了值)。

還有一個'project_enquiries'表,它包含關於項目提出的查詢的信息,所以有一個引用'項目'的'pid'鍵。同樣,有一個'project_enquiry_history'表記錄了何時(IF)查詢設置爲關閉(布爾值)。它有一個引用project_enquiry的'eid'鍵 - 每更新一個查詢可以有多個記錄(以便跟蹤誰將值設置爲什麼)。

我的查詢旨在提取尚未歸檔的項目(因此'project_history'中沒有記錄或項目的最近記錄'archived'= 0),這些查詢的查詢仍然打開(所以或者'project_enquiry_history'中沒有記錄,或者查詢的最近記錄'open'= 1)。

我真的在掙扎着從哪裏開始查詢。

回答

0

的第一件事情是,如果在project_history沒有記錄,那麼你將需要使用你的項目的ID,發現這個project_history表做你的projectsleft join。如果project_history的列中沒有相應的條目,則結果中的條目將爲空。然後,您可以鏈接該進程,使用結果在'project_enquiry_history'上執行另一個左連接以查找沒有條目的項目。

您也可以使用這些結果作爲正常的選擇數據。

它看起來是這樣的:

SELECT * from project p LEFT OUTER JOIN project_history ph ON P.ID=ph.pid LEFT OUTER JOIN project_enquiry_history peh ON peh.ID=ph.pid WHERE (archived is NULL OR archived=0) AND (open is NULL OR open=1)

您可能需要調整這個,如果你正在使用時間戳和這樣找到最近的。

+0

謝謝Poodlehat。這有很大的幫助,但我不確定如何找到最近的?我使用存儲爲INT的unix時間戳來記錄日期,在'created'字段下。 – PeeBee

+0

然後你可以在它上面執行一個MAX - 32位UNIX時間戳直到2038年纔會翻轉,如果這不是你的應用程序的問題。上面做'LEFT OUTER JOIN project_history ph',做一些類似'LEFT OUTER JOIN(SELECT ph.pid,MAX(ph.created)FROM project_history ph,project p WHERE P.ID = ph.pid GROUP BY pid)x ON p.id = x.pid' – Poodlehat

+0

對不起,先回復。我剛剛嘗試了您的建議,但現在我收到了存檔列不存在的錯誤。我現在的查詢是 'SELECT DISTINCT p.id FROM項目p L1EFT OUTER JOIN(SELECT ph.pid,MAX(ph.created)FROM project_history ph,projects p WHERE P.ID = ph.pid GROUP BY pid)x ON p.id = x.pid LEFT OUTER JOIN project_enquiries pe ON P.ID = pe.pid LEFT OUTER JOIN project_enquiry_history peh ON peh.eid = pe。ID WHERE( 存檔IS NULL 或存檔= 0 ) AND( 公開賽是NULL OR OPEN = 1 )' – PeeBee