所以让我们完全理解,假设您有一个在 localhost 中工作但不在生产模式下的查询,这是因为MySQL 5.7 and above
他们决定sql_mode=only_full_group_by
默认激活,基本上它是一种严格模式,阻止您选择非聚合字段。
这是查询(在本地工作但不在生产模式下):
SELECT post.*, YEAR(created_at) as year
FROM post
GROUP BY year
SELECT post.id, YEAR(created_at) as year // This will generate an error since there are many ids
FROM post
GROUP BY year
要验证是否sql_mode=only_full_group_by
已激活,您应该执行以下查询:
SELECT @@sql_mode; //localhost
输出:(IGNORE_SPACE, STRICT_TRANS, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
如果您没有看到它,则表示它已停用)
但是,如果在生产模式下尝试,或者在它给你错误的地方尝试它应该被激活:
SELECT @@sql_mode; //production
输出: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO...
我们ONLY_FULL_GROUP_BY
正在这里寻找。
否则,如果您使用的是phpMyAdmin,请转到 ->Variables
并搜索sql_mode
让我们以我们之前的例子来适应它:
SELECT MIN(post.id), YEAR(created_at) as year //Here we are solving the problem with MIN()
FROM post
GROUP BY year
同样的MAX()
如果我们想要所有的 ID,我们将需要:
SELECT GROUP_CONCAT(post.id SEPARATOR ','), YEAR(created_at) as year
FROM post
GROUP BY year
或另一个新添加的功能:
SELECT ANY_VALUE(post.id), YEAR(created_at) as year
FROM post
GROUP BY year
⚠️ MariaDB 不存在 ANY_VALUE
如果你想要所有的字段,那么你可以使用相同的:
SELECT ANY_VALUE(post.id), ANY_VALUE(post.slug), ANY_VALUE(post.content) YEAR(created_at) as year
FROM post
GROUP BY year
❌要停用sql_mode=only_full_group_by
然后你需要执行这个查询:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
小说见谅,希望对你有帮助。