MySQL:使用UNION ALL组合2个查询(一个空)导致错误“1048 - 列不能为NULL”

时间:2011-02-05 02:23:02

标签: mysql

我需要在一个查询中返回两个不同的结果。当我独立运行 时,第一个没有返回任何行(这很好),第二个返回一些行(也很好)。当我联合他们时,我得到1048 - Column "Date" cannot be null

我需要Date, PW, errors的结果行,我将提供一个图表,以显示Date指定的时间点系统中发生了什么。在这两个表中,Date的格式为DateTime,且绝不能为NULL。

SELECT `Date`, COUNT(`ID`) AS `PW`, 0 AS `errors`
FROM `systemlogins`
WHERE `Result` = 'PasswordFailure' AND `Date` >= DATE_SUB(NOW(), INTERVAL 1 DAY)

UNION ALL

SELECT `Date`,  0 AS `PW`, COUNT(`ID`) AS `errors`
FROM `systemerrors`
WHERE `Date` >= DATE_SUB(NOW(), INTERVAL 1 DAY)

GROUP BY ( 4 * HOUR( `Date` ) + FLOOR( MINUTE( `Date` )/15)) --i.e. full 1/4s of hour
ORDER BY ( 4 * HOUR( `Date` ) + FLOOR( MINUTE( `Date` )/15))

我已经读过MySQL可能会忽略UNION中的表'NOT NULL条件,导致该错误。我确实删除了表上的“NOT NULL”限制,并且tada,它的工作原理。现在,这些限制已经放在那里是有原因的,我想在运行上述查询时保留它们 - 有什么办法吗?

修改Order是恶棍 - 删除它会返回正确的结果,尽管有DateNULL的空行。出于我的目的,我需要以某种方式按Date订购结果。

1 个答案:

答案 0 :(得分:0)

为什么选择Date列?由于您使用的是聚合函数COUNT,但在任何选择中都没有GROUP BY子句,因此在我看来您并不关心Date列。

尝试添加GROUP BY子句,或从选择中删除Date列。