我使用以下查询创建表:
create table a (
`id` int not null auto_increment,
b varchar(10),
primary key (`id`)
);
执行
select distinct `id` from a order by `b`;
导致此错误:
错误3065(HY000):ORDER BY子句的表达式#1不在SELECT列表中,引用的列'portal.a.b'不在SELECT列表中;这与DISTINCT不兼容
但是如果我将查询更改为
select `id` from a group by `id` order by `b`;
在逻辑上等效,成功。
我正在使用official Docker image for MySQL和mysql --version
显示器
x86_64上适用于Linux的mysql Ver 8.0.12(MySQL社区服务器-GPL)
似乎MySQL仍无法在选择的不同查询中检测到功能依赖性。我对吗? MySQL的开发人员会解决这个问题吗?
答案 0 :(得分:0)
这来自MySQL 5.7中引入的新SQL模式: ONLY_FULL_GROUP_BY
此模式的目标是使MySQL成为GROUP BY查询的SQL标准。
此模式已在您的数据库上激活。您可以禁用它,也可以使查询适应标准,这可能是最好的选择。
这将引发您的错误:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
drop table a;
create table a (
`id` int not null auto_increment,
b varchar(10),
primary key (`id`)
);
INSERT INTO a VALUES (NULL, 'aaaa');
INSERT INTO a VALUES (NULL, 'bbbb');
select distinct `id` from a order by `b`;
如果删除ONLY_FULL_GROUP_BY模式,则会得到结果:
SET sql_mode = '';
drop table a;
create table a (
`id` int not null auto_increment,
b varchar(10),
primary key (`id`)
);
INSERT INTO a VALUES (NULL, 'aaaa');
INSERT INTO a VALUES (NULL, 'bbbb');
select distinct `id` from a order by `b`;
您可以在Rextester上看到它