[英]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.