为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
BIG阳 2023-08-06 14:54:21
为什么此查询会导致 SQLSTATE 错误?SQLSTATE[42000]: Syntax error or access violation: 1055 'database.events.date' isn't in GROUP BYselect `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当我在服务器上手动运行查询时,该查询执行时没有错误,并且具有预期结果。语法错误具体是什么?为什么?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

主要取自解决有关 ONLY_FULL_GROUP_BY SQL 模式的查询失败。一篇很棒的文章。

解释

从 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 子句中,或者将其从选择中排除(或者以其他方式将其包含在聚合函数中,例如count、min、max等)


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


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

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


查看完整回答
反对 回复 2023-08-06
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信