2016-02-23 29 views
1

我有一个工作查询,但必须有更好的方法来做到这一点。 下面是工作查询MYSQL查询更好的方法来分组,如果值?

SELECT gameid FROM(
    SELECT gameid, SUM(count) as total FROM (
     SELECT IF(vanguard = 1, 30, gameid) as gameid, count FROM (
      SELECT opserv_operation.gameid, opserv_games.vanguard, COUNT(opserv_games.gameid) AS count FROM opserv_operation_attendees INNER JOIN opserv_operation ON opserv_operation_attendees.operationid = opserv_operation.operationid INNER JOIN opserv_games on opserv_operation.gameid = opserv_games.gameid WHERE (start_time >= '2015-11-11' || FIND_IN_SET(opserv_operation.operationid, '17951,17701,17702,17775,17969,17890,17958,17966,17900')) AND completed = 1 AND opserv_operation_attendees.userid = 5750 AND opserv_operation_attendees.status = 4 AND opserv_operation.type <> 5 AND opserv_operation.completed = 1 GROUP BY opserv_operation.gameid) as m 
     ) as l 
    GROUP BY gameid 
    ORDER BY total DESC LIMIT 1) as k 

主查询

SELECT opserv_operation.gameid, opserv_games.vanguard, COUNT(opserv_games.gameid) AS count FROM opserv_operation_attendees INNER JOIN opserv_operation ON opserv_operation_attendees.operationid = opserv_operation.operationid INNER JOIN opserv_games on opserv_operation.gameid = opserv_games.gameid WHERE (start_time >= '2015-11-11' || FIND_IN_SET(opserv_operation.operationid, '17951,17701,17702,17775,17969,17890,17958,17966,17900')) AND completed = 1 AND opserv_operation_attendees.userid = 5750 AND opserv_operation_attendees.status = 4 AND opserv_operation.type <> 5 AND opserv_operation.completed = 1 GROUP BY opserv_operation.gameid 

游戏ID先锋

所以这里是棘手的部分。我需要它来分组并统计所有的值,但如果gameid = 30或先锋= 1,那么他们应该全部统计在一起。

因此,与上述数据,我唯一需要的是在这种情况下,游戏ID返回的游戏ID 30.将有这将是13

必须有比我有更好的办法最计数完成了。

编辑:到目前为止,这个作品非常感谢Ed Gibbs。然而,仍然返回两个值,我猜只有办法是有另一个子查询?去玩游戏。

SELECT 
CASE WHEN vanguard = 1 THEN 30 ELSE gameid END AS gameid, 
SUM(count) AS total 
FROM (SELECT opserv_operation.gameid, opserv_games.vanguard, COUNT(opserv_games.gameid) AS count FROM opserv_operation_attendees INNER JOIN opserv_operation ON opserv_operation_attendees.operationid = opserv_operation.operationid INNER JOIN opserv_games on opserv_operation.gameid = opserv_games.gameid WHERE (start_time >= '2015-11-11' || FIND_IN_SET(opserv_operation.operationid, '17951,17701,17702,17775,17969,17890,17958,17966,17900')) AND completed = 1 AND opserv_operation_attendees.userid = 5750 AND opserv_operation_attendees.status = 4 AND opserv_operation.type <> 5 AND opserv_operation.completed = 1 GROUP BY opserv_operation.gameid) as l 
GROUP BY CASE WHEN vanguard = 1 THEN 30 ELSE gameid END 
ORDER BY total DESC 
LIMIT 1; 

回答

1

如果底线你的意思是“1”和“30”有那么点算在一起,这应该工作:

SELECT 
    CASE WHEN vanguard = 1 THEN 30 ELSE gameid END AS gameid 
FROM (... main query ...) 
GROUP BY CASE WHEN gameid = 1 THEN 30 ELSE gameid END 
ORDER BY SUM(count) DESC 
LIMIT 1; 
+0

这是非常接近的。我将gameid = 1更改为vanguard = 1,并将括号内的主要查询放在opserv_operation的位置。但其返回的2个值仍然是,gameid和总数。我需要它来做游戏ID。获得游戏ID的唯一方法是做另一个子查询? – user3452747

+0

对不起“gameid”vs“先锋队”;很高兴你拿起了这些作品:)你可以通过SUM进行排序,而不必将它作为“SELECT”列表的一部分 - 它显示在我更新的答案中。 –

+0

非常感谢您的协助!我其实学到了一些东西 – user3452747