2016-02-11 130 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