【发布时间】:2021-03-21 13:29:24
【问题描述】:
我想执行一个查询,例如获取数据库中任何类型的最后一条记录,在我的本地主机上,我使用 Maria Db,查询如下:
SELECT *
FROM table_a
WHERE column_a=999
OR column_b=999
GROUP
BY `group`;
group 是我在其中保存类型的列,例如:营销、博客、订单等
此查询在本地运行良好,但在服务器上出现以下错误:
SQLSTATE[42000]:
Syntax error or access violation:
1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
'db_name.table_a.id' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by\n
The SQL being executed was:
SELECT * FROM `table_a` WHERE (`column_a`=999) OR (`column_b`=999) GROUP BY `group`"
根据MySQL document,我可以使用以下命令来实现这一点:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
但是我对 Db 没有足够的权限并得到以下错误:
#1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
我让主机帮我做这件事,他们回答说他们不想做这个操作
我使用的是 YII2 框架,现在我想在框架的 database_config.php 选项中添加它,或者将查询更改为具有相同结果的其他内容,并且不损失性能
【问题讨论】:
-
SELECT *没有意义。当您执行GROUP BY group时,具有相同group值的所有行都将被视为一个组。对于此行组,必须为每一列返回一个值,但存在很多值。如何确定您需要什么值?首先(按什么顺序?)?最大?随机的?还有什么? -
托管公司已为
sql_mode配置了正确的值。您不应尝试更改sql_mode以允许无效查询。您应该改正您的查询。我写了一个答案来解释为什么这种类型的查询在这里无效:stackoverflow.com/a/13999903/20860 -
但我对 Db 没有足够的权限 当然。但是如果你真的想改变 SQL 模式并执行你不合逻辑的查询,那么你必须改变 SESSION 而不是 GLOBAL 设置。
-
最简单的选择是完全拒绝问题的前提。这简直是荒谬的。
-
@Akina 这正是我想要的,我想要每种类型的最后一条记录,可能是 8 种类型所以 8 条记录
标签: php mysql sql yii2 greatest-n-per-group