2014-07-24 28 views
0

這是我這工作我試圖簡化MySQL查詢和我沒有運氣

SELECT 
    COUNT(WRK.workorder_id) AS 'count', 
    USR.user_name, 
    IF(
     ((COUNT(WRK.workorder_id) * 100)/(SELECT COUNT(workorder_id) FROM mod_workorder_data WHERE status_id < 8 AND assigned_user_id IS NOT NULL) < 50), 
     (50- ((COUNT(WRK.workorder_id) * 100)/(SELECT COUNT(workorder_id) FROM mod_workorder_data WHERE status_id < 8 AND assigned_user_id IS NOT NULL))), 
     -((COUNT(WRK.workorder_id) * 100)/(SELECT COUNT(workorder_id) FROM mod_workorder_data WHERE status_id < 8 AND assigned_user_id IS NOT NULL)) 
    ) AS 'weight' 
FROM mod_workorder_data WRK 
LEFT JOIN mod_users_data USR ON USR.user_id = WRK.assigned_user_id 
WHERE 
    status_id < 8 
    AND WRK.assigned_user_id IS NOT NULL 
GROUP BY USR.user_name 

導致此原始查詢:

+-------+-----------+---------+ 
| count | user_name | weight | 
+-------+-----------+---------+ 
|  7 | 1:1Sum | 47.3384 | 
| 47 | ahin  | 32.1293 | 
| 19 | asutt  | 42.7757 | 
| 26 | bwan  | 40.1141 | 
|  4 | cperr  | 48.4791 | 
| 41 | dbemo  | 34.4106 | 
| 41 | derob  | 34.4106 | 
| 38 | dmay  | 35.5513 | 
| 39 | jsue  | 35.1711 | 
|  1 | lmar  | 49.6198 | 
+-------+-----------+---------+ 

所以我認爲查詢可以簡化以減少冗餘,所以我想出了這個:

SET @total := (SELECT COUNT(workorder_id) FROM mod_workorder_data WHERE status_id < 8 AND assigned_user_id IS NOT NULL); 

SELECT 
    @countIds := COUNT(WRK.workorder_id) AS 'count', 
    USR.user_name, 
    IF(
     (@countIds * 100)/@total < 50, 
     (50 - (@countIds * 100)/@total), 
     -(@countIds * 100)/@total 
    ) AS 'weight' 
FROM mod_workorder_data WRK 
LEFT JOIN mod_users_data USR ON USR.user_id = WRK.assigned_user_id 
WHERE 
    status_id < 8 
    AND WRK.assigned_user_id IS NOT NULL 
GROUP BY USR.user_name 

導致此:

+-------+-----------+--------+ 
| count | user_name | weight | 
+-------+-----------+--------+ 
|  7 | 1:1Sum | NULL | 
| 47 | ahin  | NULL | 
| 19 | asutt  | NULL | 
| 26 | bwan  | NULL | 
|  4 | cperr  | NULL | 
| 41 | dbemo  | NULL | 
| 41 | derob  | NULL | 
| 38 | dmay  | NULL | 
| 39 | jsue  | NULL | 
|  1 | lmar  | NULL | 
+-------+-----------+--------+ 

任何人都可能在我的方式看到錯誤?我在簡化的查詢中必須有一些邏輯錯誤,但我不能說出什麼?

我在Fedora 18盒子上使用MySql版本5.5.32,如果它有很大的區別。

感謝

丹Bemowski

+0

你試過扔在SELECT語句前面的解釋?這在過去幫助(拯救)了我很多。 –

+0

我想你會有更多的運氣,如果你真的描述了(文中)你想做什麼,丹。 – jcoppens

+0

我以爲我做到了。我正試圖簡化頂級查詢。頂部的原始查詢爲我提供了正在尋找的正確結果。底部查詢只是頂級查詢的簡化版本。 –

回答

1

請,使用內嵌視圖,而correlated subquery

SELECT COUNT(WRK.workorder_id) AS 'count', 
    USR.user_name, 
    IF(
     ((COUNT(WRK.workorder_id) * 100)/tab_cnt.cnt < 50), 
     (50- ((COUNT(WRK.workorder_id) * 100)/tab_cnt.cnt)), 
     -((COUNT(WRK.workorder_id) * 100)/tab_cnt.cnt) 
    ) AS 'weight' 
FROM mod_workorder_data WRK LEFT JOIN mod_users_data USR ON USR.user_id = WRK.assigned_user_id 
    INNER JOIN (
     SELECT COUNT(workorder_id) AS cnt 
     FROM mod_workorder_data WHERE status_id < 8 AND assigned_user_id IS NOT NULL 
    ) AS tab_cnt 
WHERE status_id < 8 
    AND WRK.assigned_user_id IS NOT NULL 
GROUP BY USR.user_name; 
+0

這工作完美... THanks InoS:^) –

+0

@DanBemowski聽起來不錯。請隨時接受我的回答;) –

+0

相當新的到stackoverflow。我剛剛檢查了旁邊的綠色複選標記。我猜想接受這一切,我必須這樣做,對嗎? –