繁体   English   中英

Laravel:语法错误或访问冲突:1055解决方案

[英]Laravel: Syntax error or access violation: 1055 solution

为什么此查询会导致 SQLSTATE 错误?

SQLSTATE[42000]: Syntax error or access violation: 1055 'database.events.date' isn't in GROUP BY

select `events`.`listing_id`, `events`.`date`, `events`.`listing_name`, count(*) as number_sold 
from `events` 
where `events`.`date` >= "2020-07-14" 
group by `events`.`listing_id` 
order by `events`.`date` asc

当我在服务器上手动运行查询时,查询执行没有错误,并获得预期的结果。

具体是什么语法错误,为什么?

主要取自Solve Query Failures About ONLY_FULL_GROUP_BY SQL Mode 一篇极好的文章。

解释

从 MySQL 5.7 开始,他们使语法更加严格,以阻止语义不正确的查询运行。 一个特殊的新规则称为ONLY_FULL_GROUP_BY ,它可以防止您在使用 GROUP BY 子句时出错。

很容易理解的例子是这样的:

假设我们要从该表中计算网站上最受欢迎的页面:

+----+--------------------+---------+---------------------+
| id | page_url           | user_id | ts                  |
+----+--------------------+---------+---------------------+
|  1 | /index.html        |       1 | 2019-04-17 12:21:32 |
|  2 | /index.html        |       2 | 2019-04-17 12:21:35 |
|  3 | /news.php          |       1 | 2019-04-17 12:22:11 |
|  4 | /store_offers.php  |       3 | 2019-04-17 12:22:41 |
|  5 | /store_offers.html |       2 | 2019-04-17 12:23:04 |
|  6 | /faq.html          |       1 | 2019-04-17 12:23:22 |
|  7 | /index.html        |       3 | 2019-04-17 12:32:25 |
|  8 | /news.php          |       2 | 2019-04-17 12:32:38 |
+----+--------------------+---------+---------------------+

你可以简单地写:

SELECT page_url, user_id, COUNT(*) AS visits 
    -> FROM web_log 
    -> GROUP BY page_url ORDER BY COUNT(*) DESC;

并得到以下结果:

+-------------------+---------+--------+
| page_url          | user_id | visits |
+-------------------+---------+--------+
| /index.html       |       1 |      3 |
| /news.php         |       1 |      2 |
| /store_offers.php |       3 |      2 |
| /faq.html         |       1 |      1 |
+-------------------+---------+--------+

但是user_id列代表什么? 如果你仔细想想,它的内容是完全随机的。

您需要将其包含在 group_by 子句中,或者将其从您的 select 中排除(或以其他方式将其包含在聚合 function 中,如countminmax等)

所以对我来说,我需要在我的 select 中包含其他非聚合列:

select `events`.`listing_id`, `events`.`date`, `events`.`listing_name`, count(*) as number_sold 
from `events` 
where `events`.`date` >= "2020-07-14"
group by `events`.`listing_id`, `events`.`date`, `events`.`listing_name`
order by `events`.`date` asc

在我的情况下,这给出了预期的数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM