我试图简化mysql查询,但运气不好

我试图简化mysql查询,但运气不好,mysql,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

这是我最初的查询,它是有效的

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
因此,我认为可以简化查询以减少冗余,因此我提出了以下建议:

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
有人能看出我的错误吗?我必须有一些逻辑错误的简化查询,但我不能告诉什么

我在Fedora 18盒上使用MySql版本5.5.32,如果它有很大不同的话

谢谢


Dan Bemowski

请使用内联视图而不是相关子查询:


您是否尝试过在select语句前面抛出解释?这在过去帮了我很多忙。我想如果你真的在文本中描述你想做什么,你会更幸运,丹。我想我做到了。我试图简化最上面的查询。顶部的原始查询提供了我正在寻找的正确结果。底部查询应该是顶部查询的简化版本。如果需要任何帮助,请尝试显示您的表structure@DanBemowski听起来不错。请随意接受我的回答;对stackoverflow来说是相当新的。我刚刚检查了它旁边的绿色复选标记。我猜我会接受这就是我要做的,对吗?
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 |
+-------+-----------+--------+
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;