我有一个小问题,我想在这里替换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,我需要更多特权才能激活它。
答案 0 :(得分:1)
当您未对旧版本的mysql指定聚合查询时,默认行为是它将在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
。这样可以避免您忽略数据问题。