在以下查询中,将HAVING子句中的比较运算符从“=”更改为“<”当查询返回时,没有结果更改输出,以便返回1行(所有NULL)或没有返回行。
有人可以解释为什么这种行为如证明的那样?理想情况下,我希望第一个查询返回0行,但如果不将它包装在另一个查询中以排除NULL,那将会很好。
查询:
SELECT `templates`.*
FROM `templates`
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id`
HAVING COUNT(items.id) = 0
结果:
NULL,NULL,NULL...
(1 row(s) returned)
与之相比:
查询:
SELECT `templates`.*
FROM `templates`
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id`
HAVING COUNT(items.id) < 0
结果:
(0 row(s) returned)
但是,HAVING COUNT(items.id) < 1
的这种变化会返回NULL行:
查询:
SELECT `templates`.*
FROM `templates`
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id`
HAVING COUNT(items.id) < 1
结果:
NULL,NULL,NULL...
(1 row(s) returned)
答案 0 :(得分:1)
简单,count()函数永远不会返回负数。您的情况是having count(items.id) < 0
,这意味着having 0 < 0
始终是false
。但是having count(items.id)=0
可以是真实的意思,或count(items.id)<1
可以是真的意味着0 = 0或0 <1是真的。
mysql> select 1 from test having count(id)=0;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.29 sec)
mysql> select 1 from test having count(id)<0;
Empty set (0.00 sec)