2011-11-08 60 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