MIN()导致MySQL返回全空行而不是0行

use*_*908 2 mysql sql database

我有两个表,services并且extraFees与1xn至相关services.id = extraFees.serviceId。我的问题是,当我执行以下查询一个不存在的组合s.ids.category,我仍然得到1 row(s) returned,与各界NULL。

SELECT 100 + (s.feeRate * MIN(ef.extra)) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG'
Run Code Online (Sandbox Code Playgroud)

我知道罪魁祸首是MIN(),因为如果我将其替换为数字或NULL,0 row(s) returned则会得到,这就是我想要的。

SELECT 100 + (s.feeRate * 5) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG'
SELECT 100 + (s.feeRate * NULL) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG'
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何避免呢?

Gle*_*enn 5

聚合函数将返回结果。尝试这个:

CREATE TABLE x(id int);
SELECT MIN(id) FROM x
Run Code Online (Sandbox Code Playgroud)

您将获得1行:NULL。如果要忽略NULL结果,可以包装一个子查询:

SELECT y.id
  FROM (SELECT MIN(id) AS id FROM x) y
  WHERE y.id IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

或利用HAVING条款。