mysql 具有AVG函数的空集与任意非空集的并集

nqwrtyyt  于 2023-04-05  发布在  Mysql
关注(0)|答案(2)|浏览(145)

这是我的第一个问题,所以请耐心等待。:)
我们是两个开发人员,都有相同的MySql DB,具有相同的表和值。
一个是MySql版本5. 5,工作正常(显然),正如其他开发人员告诉我的那样。
在我的机器与MySql 5.1.44(一个基本的MAMP安装)我有以下奇怪的问题。
一个非常大的查询(不是我的)失败,错误是“Column 'xd' cannot be null”。
删除件我slimmedi它到这个:

select xd, avg(media) from questionario_punteggi where somefield = 1 union select 1,2

注意,没有somefield = 1的记录,所以第一次select返回一个空集
我们有一个带有AVG()函数的SELECT,它返回一个空集UNION,另一个SELECT返回一些东西(我现在举个例子,1,2只是随机值)

  • 如果我删除AVG(),查询就可以工作。
  • 如果我删除xd(和右边的2,1,2),查询就可以工作了。
  • 如果我删除UNION,查询就可以工作。
  • 如果我用somefield = 1设置某个记录,查询就可以工作。
  • 在另一台机器5.5上,查询工作。

否则,错误为:

1048 -列'xd'不能为null

字段包括:

`xd` char(3) NOT NULL DEFAULT '001',
`media` decimal(7,4) NOT NULL DEFAULT '0.0000',
`somefield` tinyint(4) NOT NULL DEFAULT '0',

天啊。有什么能帮忙的吗?谢谢。

更新
在MySql〈= 5.1中有BUG报告给我,在MySql 5.5之前已经修复,具体情况我不清楚,但我相信来源

ui7jx7zq

ui7jx7zq1#

尝试使用SELECT IFNULL();

SELECT IFNULL(xd,0), avg(media) 
FROM questionario_punteggi 
WHERE somefield = 1 
UNION
SELECT 1,2

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

h9a6wy2h

h9a6wy2h2#

我建议颠倒UNION中的查询顺序。
这是因为UNION中的第一个SELECT决定了结果集中列的数据类型;在您的示例中,UNION的第一列采用questionario_punteggi.xd列的类型:即CHAR(3) NOT NULL
由于您对UNION的第一部分应用聚合函数,因此即使 * 没有记录与过滤条件匹配,它也会导致单行 *。如GROUP BY (Aggregate) Functions中所述:
AVG()返回NULL,如果没有匹配的行。
hiddenx 1 m10n1x列的值通常是从匹配过滤器的记录中不确定地选择的记录(这就是为什么您可能不想这样做的原因);但是,由于在这种情况下没有匹配的记录,服务器返回NULL(显然不能进入具有NOT NULL属性的列)。
通过颠倒UNION的顺序,该列将不具有NOT NULL属性。您可能需要适当地为列设置别名:

SELECT 1 AS xd, 2 AS avg_media
UNION
SELECT xd, AVG(media) FROM questionario_punteggi WHERE somefield = 1

用这个来依次解释你的每一个观察结果:

  • 如果我删除AVG(),查询就可以工作。

由于不再执行聚合,因此UNION中的第一个SELECT将生成一个空记录集,因此第一列中没有NULL记录。

  • 如果我删除xd(和右边的2,1,2),查询就可以工作了。

由于隐藏列不再被选中,MySQL不再返回NULL

  • 如果我删除UNION,查询就可以工作。

这是您的MySQL版本和您同事的版本之间可能已修复的错误:NOT NULL属性不应该真正应用于UNION结果。

  • 如果我用somefield = 1设置某个记录,查询就可以工作。

为隐藏列选择的值是匹配记录中的不确定值(但由于列的属性,它不是NULL值)。

  • 在另一台机器5.5上,查询工作。

这个bug(我还在寻找它)必须在你各自的MySQL版本之间得到修复。

相关问题