可以用JOIN缩短这个mysql子查询吗?

时间:2010-11-30 14:47:11

标签: mysql

我试图在'archive'表中找到与historyID为NULL,worktype =“WEST”和至少四个月的completeDate具有相同workID的所有条目。我正在使用子查询来完成此请求。有更有效的方法吗?我的查询如下。

SELECT * from archive b WHERE b.workID IN 
(SELECT a.workID FROM archive a, worktypes t 
WHERE a.historyID IS NULL AND (t.worktype IN ('WEST') AND a.worktype = t.id)
AND a.completeDate >= DATE(NOW() - Interval 4 month));

附加信息:表格仅与工作类型相关。基本上我正在使用worktypes表,所以我可以键入'WEST'而不是给出一个id号,这样一目了然就更容易理解查询。我添加了查询。我没有复制并粘贴它们。糟糕。

谢谢!

3 个答案:

答案 0 :(得分:1)

SELECT b.* 
    FROM archive b
        INNER JOIN archive a
            on b.workID = a.workID
                AND a.historyID IS NULL
                AND a.completeDate >= DATE(NOW() - Interval 4 month)
        INNER JOIN worktypes t
            ON a.worktype = t.id 
                AND t.worktype = 'WEST'

答案 1 :(得分:0)

您的查询和建议的解决方案的问题是我们不知道表格如何相互关联。您在归档中的哪个列也在工作类型中?

另外,你应尽可能避免使用“IN”,效率低下。

答案 2 :(得分:0)

是的,确定: SELECT * from archive a LEFT JOIN worktypes t ON a.workID = t.workID WHERE a.historyID IS NULL AND t.worktype IN('WEST')AND a.completeDate> = DATE(NOW() - Interval 4 month) );

LEFT JOIN将获取第一个表中的所有条目,并将匹配的第二个表中的等效列附加到它们。

希望这会有所帮助。