我应该在该查询中使用什么替换GROUP BY?

时间:2018-08-22 07:32:54

标签: mysql sql group-by

我有一个小问题,我想在这里替换GROUP BY pid,但我不知道该怎么用。这是我的查询

SELECT `s`.`name` `server_name`, 
       `g`.`name` `group_name`, 
       `a`.`pid`  `pid` 
FROM   `panel_admins` `a` 
       LEFT JOIN `panel_players` `p` 
              ON `a`.`pid` = `p`.`id` 
       LEFT JOIN `panel_admin_groups` `g` 
              ON `a`.`gid` = `g`.`id` 
       LEFT JOIN (SELECT `username`, 
                         `pid` 
                  FROM   `panel_players_username` 
                  GROUP  BY `pid` 
                  ORDER  BY `last_used` DESC) `u` 
              ON `a`.`pid` = `u`.`pid` 
       LEFT JOIN `panel_servers` `s` 
              ON `a`.`sid` = `s`.`id` 
WHERE  ( Timestampdiff(minute, add_time, Now()) < `g`.`usetime` 
          OR `g`.`usetime` = 0 ) 
ORDER  BY `immunity` DESC; 

我的MySQL表: 在panel_admins表中,我有这个:

aid     pid     sid    gid   add_time   
--------------------------------------------------------------
 5      168     12     10   2018-08-13 18:05:36
 6      168     11     10   2018-08-13 18:05:36  

在panel_players中:

id(that corresponds to pid)     steamid     country
----------------------------------------------------
168                           steamidhere       EN

在panel_players_username中:

pid     username     connections      last_used
----------------------------------------------------
168     peter          21            2018-08-13 17:50:26

在panel_servers中:

id(that corresponds to sid)     name        ip        port         rcon_pw
--------------------------------------------------------------------------
10                           surfcombat     IPHERE     PORTHERE    RCONHERE
11                           jailbreak      IPHERE     PORTHERE    RCONHERE
12                           executes       IPHERE     PORTHERE    RCONHERE

我想在此查询中替换GROUP BY,因为我的网络托管确实允许我使用此GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

  

我已经尝试禁用它,但是我在使用付费虚拟主机   CPanel,我需要更多特权才能激活它。

1 个答案:

答案 0 :(得分:1)

当您未对旧版本的指定聚合查询时,默认行为是它将在retrieve data from an unspecified row中对任何未分组和未聚合的列进行分组。这通常不是所希望的,但是因为它“有效”,所以许多mysql开发人员从未停止过思考:

  

此外,通过添加ORDER BY子句不能影响每个组中值的选择。

现在,它希望您变得具体。例如

              SELECT MIN(`username`), 
                     `pid` 
              FROM   `panel_players_username` 
              GROUP  BY `pid` 

我们现在被迫告诉mysql 要为未分组的列选择哪个值。在这里,我选择了MIN。当然,MAX可能是正确的,甚至可能是其他。但是至少现在,您必须考虑您的数据,并且如果单个pid与多个用户名相关联,您实际上想做什么?

请不要尝试禁用sql_mode=only_full_group_by。这样可以避免您忽略数据问题。