mysql - 关闭 ONLY_FULL_GROUP_BY 是个好主意吗?

标签 mysql mariadb

我想要获取“订单”表中但不在“客户”表中的客户。 “快速订购”客户。我写了这个查询:

SELECT `email`, `firstname` , `lastname`, `telephone`, `ip`, NULL
FROM `order`
WHERE `customer_id` = 0 AND `email` NOT IN (SELECT `email` FROM `ocustomer`)
GROUP BY `email`

但我得到:

SELECT list contains nonaggregated column (firstname, lastname, telephone, ip) this is incompatible with sql_mode=only_full_group_by

我这里有两个选择:

  1. 仅关闭_FULL_GROUP_BY。我知道该怎么做,但这是一个好主意吗?我知道这很有用,但就我而言,如果它打开,我需要重写我的查询
  2. 使用 ANY_VALUE(),但它不适用于 MariaDb。另一方面,我无法使用聚合函数,因为我有文本字段。所以我不知道这里还需要更改什么才能与 ONLY_FULL_GROUP_BY 一起使用。

我很困惑该怎么办?关闭 ONLY_FULL_GROUP_BY 是个好主意还是可能有另一种方法可以在不使用 ANY_VALUE() 的情况下重写我的查询?

最佳答案

关闭它不是一个好主意。它可以帮助您避免错误,否则会导致错误的查询结果。

您可以这样编写查询:

SELECT `email`, `firstname` , `lastname`, `telephone`, `ip`, NULL
FROM `order`
WHERE `customer_id` = 0 AND `email` NOT IN (SELECT `email` FROM `ocustomer`)
GROUP BY `email`, `firstname` , `lastname`, `telephone`, `ip`

当每封电子邮件有多行具有不同的值时,您仍然可以使用聚合函数。不是求和或计数,而是最小和最大工作。

SELECT `email`, MIN(`firstname`) AS firstname , MIN(`lastname`) AS lastname, /* ... you get the idea */
FROM `order`
WHERE `customer_id` = 0 AND `email` NOT IN (SELECT `email` FROM `ocustomer`)
GROUP BY `email`

关于mysql - 关闭 ONLY_FULL_GROUP_BY 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54345743/

相关文章:

php - 如何加载 codeigniter-base-model 中的所有行?休息API

mysql - 单独执行时查询速度快,嵌套时查询速度慢

MySQL:将区分大小写设置为默认值

python - `pip install mysqlclient` 找不到 `mariadb` 因为它 's obsoleted by ` MariaDB-client`

MySQL ExtractValue 跟随兄弟替代

mysql - Laravel orderby 与 groupby sql

Python MySQL 插入重复键

hibernate - 在 Hibernate 中使用 @Query 进行带参数的 native 查询

mysql - 涉及范围时,索引中第一个具有较高基数的列?

mysql - 按枚举计数,包括计数为 0 的可能枚举值