【问题标题】:Docker MySQL8 - aggregated query without GROUP BYDocker MySQL8 - 没有 GROUP BY 的聚合查询
【发布时间】:2021-04-20 02:41:04
【问题描述】:

我正在使用 Docker 生成 MySQL 8 容器,以及 PHP 7 和 phpMyAdmin。

在运行带有聚合函数的查询时,我遇到了 phpMyAdmin 的问题。我认为phpMyAdmin可能有问题。

所以我把它带到了另一个名为 Navicat 的数据库应用程序中。我创建了与 Docker MySQL 8 容器的成功连接,当我尝试运行相同的查询时,我得到了相同的错误。如下:

In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'myDb.mytable.uid'; 
this is incompatible with sql_mode=only_full_group_by

这让我相信问题出在我的 Docker 设置中。这是 docker-compose.yml 文件:

version: "3.7"
services:
  www:
    build: .
    ports:
     - "8001:80"
    volumes:
     - ./www:/var/www/html/
    links:
     - db
    networks:
     - default
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    ports:
     - "3306:3306"
    environment:
     MYSQL_DATABASE: myDb
     MYSQL_USER: user
     MYSQL_PASSWORD: test
     MYSQL_ROOT_PASSWORD: test
    volumes:
     - ./dump:/docker-entrypoint-initdb.d
    networks:
     - default
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
     - db:db
    ports:
     - 8000:80
    environment:
     MYSQL_USER: user
     MYSQL_PASSWORD: test
     MYSQL_ROOT_PASSWORD: test
volumes:
 mysql-data:
 persistent:

这是我的 Dockerfile:

FROM php:7.0.30-apache
RUN docker-php-ext-install pdo pdo_mysql

我看到几篇帖子告诉我使用以下命令更新 sql_mode:

SET sql_mode = ''

但是返回零结果,我仍然得到相同的聚合错误。

我尝试了这个查询:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

但我只得到以下结果:

访问被拒绝;您需要(至少其中之一)SUPER 或 SYSTEM_VARIABLES_ADMIN 权限才能执行此操作

它必须是我可以在我的 docker-compose.yml 文件中执行的操作,这将允许我运行查询而不会出现聚合错误。

如果没有,我怎样才能成功运行带有聚合函数的查询而不会出错?

我尝试过的来源:

Disable ONLY_FULL_GROUP_BY

SELECT list is not in GROUP BY clause and contains nonaggregated column .... incompatible with sql_mode=only_full_group_by

编辑

这是我刚刚测试的一个简单查询,它产生了相关错误:

SELECT
  uid,
  COUNT(pol)
FROM
  myTable

【问题讨论】:

  • 该警告阻止您运行结果不确定的查询。尝试修复查询是更推荐的做法。
  • @WillemRenzema - 我更新了我的问题以包含我运行的一个简单查询,该查询产生了错误。
  • @WillemRenzema - 另外,当我在实时服务器上运行相同的查询时,我没有得到聚合错误。

标签: php docker pdo docker-compose mysql-8.0


【解决方案1】:
SELECT
  uid,
  COUNT(pol)
FROM
  myTable

此查询随机返回单个uid(更准确地说,是不确定的),以及整个表中非空pol 值的数量(因此,1 行结果)。它向您发出警告,因为每次运行查询时uid 都可能不同。 (即使您重复运行它,它可能看起来像相同的值,但它可能随时更改。)

你可能想要这样的东西:

SELECT
  uid,
  COUNT(pol)
FROM
  myTable
GROUP BY uid

这将为每个uid 返回一行,以及该uid 的非空pol 值的数量。

您的原始查询定义不明确(同一查询和数据集的不同结果),这就是您看到错误的原因,该错误首先存在以保护您。不同的服务器没有给出错误的事实可能是由于不同的sql_mode 或不同的 MySQL 版本。

【讨论】:

  • 我想我明白你在说什么。我确实已经尝试过您上面包含的查询,是的,我确实得到了您指示的结果。你说的对。 uid 似乎是引发查询的原因。我不确定我是否应该删除这个问题,因为错误肯定在我这边。非常感谢您抽出时间来帮助我。
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多