【问题标题】:MySQL sub-query AND 'NOT IN'MySQL 子查询 AND 'NOT IN'
【发布时间】:2011-11-08 16:01:21
【问题描述】:

对不起,如果之前已经回答过;我有点不确定如何最好地描述这个问题,不要介意搜索它。但是这里...

基本上我有一个“项目”表,其中包含“id”和“标题”。我还有一个“projects_history”表,它在(IF)项目设置为存档(布尔值)时保存信息。它有一个引用项目的“pid”键——每个项目在更新时可以有多个记录(以便跟踪谁将值设置为什么)。

还有一个“project_enquiries”表,其中包含有关已为项目提出的查询的信息,因此有一个引用“项目”的“pid”键。同样,有一个“project_enquiry_history”表记录何时(IF)查询设置为关闭(布尔值)。它有一个引用 project_enquiry 的“eid”键 - 每个查询在更新时可以有多个记录(以便跟踪谁将值设置为什么)。

我的查询旨在提取尚未归档的项目(因此“project_history”中没有记录或该项目的最新记录“已归档”= 0),这些项目的查询仍在open(因此“project_enquiry_history”中没有记录,或者查询的最新记录为“open”=1)。

我真的很想从哪里开始查询。

【问题讨论】:

    标签: mysql subquery limit


    【解决方案1】:

    第一件事是,如果project_history 中没有记录,那么您需要使用您的项目ID 在project_history 表上对projects 表执行left 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)

    如果您使用时间戳等,您可能需要对其进行调整以找到最新的。

    【讨论】:

    • 谢谢贵宾犬。这很有帮助,但我不知道如何找到最新的?我正在使用存储为 INT 的 unix 时间戳来记录日期,在“创建”字段下。
    • 你可能可以在它上面做一个 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
    • 抱歉没有早点回复。我刚刚尝试了您的建议,但现在我收到一个错误,即存档列不存在。我的查询现在是SELECT DISTINCT p.id FROM projects 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 ( archived IS NULL OR archived =0 ) AND ( OPEN IS NULL OR OPEN =1 )
    • 好的,这就是我目前所拥有的 SELECT DISTINCT p.id FROM projects p LEFT OUTER JOIN (SELECT ph.pid, ph.archived, 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 (SELECT peh.eid, peh.open, MAX(peh.created) FROM project_enquiry_history peh, project_enquiries pe WHERE pe.ID=peh.eid GROUP BY pid) y ON pe.id=y.eid WHERE ( archived IS NULL OR archived =0 ) AND ( OPEN IS NULL OR OPEN =1 ) 但是它似乎没有挑选出最新的 project_enquiry_history 记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多