草庐IT

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

coder 2023-10-18 原文

这是我的第一个问题,所以请耐心等待.. :)

我们是两个开发人员,都拥有相同的 MySql 数据库,其中包含相同的表和值。

一个是 MySql 5.5 版并且工作正常(显然),正如其他开发人员告诉我的那样。

在装有 MySql 5.1.44(基本 MAMP 安装)的机器上,我遇到了以下奇怪的问题。

一个非常大的查询(不是我的)失败并出现错误“Column 'xd' cannot be null”。

删除部分我将其简化为:

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

请注意,没有包含 somefield = 1 的记录,因此第一个选择返回一个空集

我们有一个带有 AVG() 函数的 SELECT,它返回一个空集 UNION 另一个 SELECT 返回一些东西(1,2 只是我现在作为示例放置的随机值)

  • 如果我删除 AVG(),则查询有效。
  • 如果我删除 xd(以及右侧的 1,2 中的 2),则查询有效。
  • 如果我删除 UNION,则查询有效。
  • 如果我用 somefield = 1 设置了一些记录,查询就有效。
  • 在另一台机器 5.5 上查询有效。

否则错误为:

1048 - 列“xd”不能为空

字段是:

`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="">

最佳答案

我建议颠倒 UNION 中的查询顺序。

这是因为 UNION 中的第一个 SELECT 决定了结果集中列的数据类型;在您的例子中,UNION 的第一列采用了 questionario_punteggi.xd 列的类型:即 CHAR(3) NOT NULL .

由于您对 UNION 的第一部分应用聚合函数,因此它会产生单行,即使没有记录与过滤条件匹配。如 GROUP BY (Aggregate) Functions 下所述:

AVG() returns NULL if there were no matching rows.

hidden 的值xd 列通常是从那些与过滤器匹配的记录中不确定选择的记录(这就是为什么您可能不想这样做的原因);然而,由于在这种情况下没有记录匹配,服务器反而返回 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

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

  • If I remove the AVG() the query works.

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

  • If I remove xd (and the 2 of 1,2 to the right) the query works.

    由于不再选择隐藏列,MySQL 不再在其位置返回 NULL

  • If I remove the UNION the query works.

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

  • If I set some record with somefield = 1 the query works.

    为隐藏列选择的值是来自匹配记录的不确定值(但非NULL 值,因为该列的属性)。

  • On the other machine 5.5 the query works.

    这个错误(我仍在寻找它)一定已经在你们各自的 MySQL 版本之间修复了。

关于mysql - 具有 AVG 函数的空集与任意非空集的 UNION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402035/

有关mysql - 具有 AVG 函数的空集与任意非空集的 UNION的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  10. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

随机推荐