我的 SQL 语句在我笔记本电脑的 MySQL(服务器版本:5.5.62-0ubuntu0.14.04.1 -(Ubuntu))上正确返回,但在我的服务器(服务器版本:5.7.26-0ubuntu0.16.04.1 -(Ubuntu))上它返回错误。
SELECT *
FROM `orders`
WHERE `mail_sent`='No'
AND `datetime` < DATE_SUB(NOW(), INTERVAL 15 MINUTE)
GROUP BY `contact_id`
ORDER BY `datetime` ASC;
Run Code Online (Sandbox Code Playgroud)
1055 - SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“shop.orders.id”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容
小智 8
我认为这个问题是由于strict mode在您的 MySQL 版本中启用了。请禁用严格模式,然后重试。
禁用遵循如何在 localhost (xampp) 中打开/关闭 MySQL 严格模式?
STRICT_TRANS_TABLES负责设置 MySQL 严格模式。
要检查是否启用了严格模式,请运行以下 sql:
SHOW VARIABLES LIKE 'sql_mode';
Run Code Online (Sandbox Code Playgroud)
如果值之一是STRICT_TRANS_TABLES,则启用严格模式,否则不启用。就我而言,它给了
+--------------+------------------------------------------+
|Variable_name |Value |
+--------------+------------------------------------------+
|sql_mode |STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION|
+--------------+------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
因此,在我的情况下启用了严格模式,因为其中一个值是 STRICT_TRANS_TABLES。
要禁用严格模式,请运行以下 sql:
set global sql_mode='';
Run Code Online (Sandbox Code Playgroud)
[或除 STRICT_TRANS_TABLES 之外的任何模式。例如:设置全局 sql_mode='NO_ENGINE_SUBSTITUTION';]
要再次启用严格模式,请运行以下 sql:
set global sql_mode='STRICT_TRANS_TABLES';
Run Code Online (Sandbox Code Playgroud)
如果您不想禁用什么,strict_mode那么您必须更改您的 sql 查询以遵循 sql standard。
像这样..
SELECT
aggregated_column,
aggregated_column,
aggregation_function(column),
aggregation_function(column),
aggregation_function(column)
FROM
TABLE
WHERE [CLAUSE]
GROUP BY [GROUP BY FIELD]
WHILE [CLAUSE]
ORDER BY
Run Code Online (Sandbox Code Playgroud)
对于您的查询..
SELECT
contact_id,
min(mail_sent),
min(datetime),
max(datetime),
FROM `orders`
WHERE `mail_sent`='No'
AND `datetime` < DATE_SUB(NOW(), INTERVAL 15 MINUTE)
GROUP BY `contact_id`
ORDER BY `datetime` ASC;
Run Code Online (Sandbox Code Playgroud)
如果这有帮助,请告诉我。