我试图简化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;