簡體   English   中英

我正在嘗試簡化mysql查詢並且沒有運氣

[英]I am trying to simplify a mysql query and am not having luck

這是我的原始查詢有效

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版,如果有很大的不同的話。

謝謝

丹·貝莫夫斯基

請使用內聯視圖而不是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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM