2016-02-11 94 views
0

对于标题感到抱歉,我找不到我的问题的简称或描述。自定义MySql查询

表-A:每一行是一个用户请求(ID,...,状态)

表-B:在表-A每个请求可以具有在表-B 1个或更多的行作为用于请求子部分(ID,REQUEST_ID, ....,状态)

我的系统用cron处理Table_B中的行,同时运行多个cron。 cron在完成时将Table_B中的状态设置为3(完成)。

现在我需要知道每个请求(Table_A)的所有子节(Table_B行)何时完成,以便我可以更新Table_A中的状态。

我现在正在做的是在Table_A(TOP 1)中选择第一个请求,然后获取Table_B中所有子节点的状态,并检查它们是否都具有状态== 3,这有效,但我希望能够通过单个查询来完成此操作,而不需要检查代码中的值。

事情是这样的:

select the request_id's 
    from Table_B where **all the rows** with this request_id has status=3 

任何想法?任何帮助表示赞赏。

回答

1

试试这个:

SELECT request_id 
FROM Table_B 
GROUP BY request_id 
HAVING COUNT(CASE WHEN status <> 3 THEN 1 END) = 0 

这将选择request_id值是只有相关status = 3

注:我假设status是一个NOT NULL字段。

+0

tnx这似乎是工作,使用这样的查询会对性能有多大影响?考虑一个具有100,000行以上的表格 – Exlord

+0

如果表格已正确编制索引,它应该执行OK。你可以用你的实际数据来尝试它,并告诉我们它的表现如何。或者,您可以尝试使用“NOT EXISTS”并查看它的比较结果。 –

+0

'having'在我的小测试表中看起来要快得多,它花费了0.0005秒,其中'DREXIST'查询由@DRapp在同一张表上用子查询写入'0.0476秒'。但我认为我应该用更大的表格做另一项测试。 – Exlord

1

怎么样

select 
     a.id 
    from 
     Table_A a 
    where 
     a.id NOT EXISTS(select b.request_id 
          from Table_B b 
          where a.id = b.request_id 
          AND b.staus <> 3) 

如果表-B上(REQUEST_ID,状态)索引。 NOT EXISTS运行,直到找到任何与查询匹配的查询,而不是与子查询中匹配的EVERY RECORD相匹配,因此它应该快速跳转到下一个记录。

+0

tnx,这个工程,但它似乎'拥有'要快得多。 – Exlord