我刚写了以下SQL查询:
SELECT * from (SELECT voornaam, achternaam, TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE())
AS Leeftijd FROM leiding)
AS kolommen
HAVING Leeftijd < AVG(Leeftijd)
ORDER BY Leeftijd;
它不会返回任何结果,但是当我单独执行这些查询时,它们会给出结果:
SELECT AVG(Leeftijd) from (SELECT voornaam, achternaam, TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE()) AS Leeftijd FROM leiding) AS kolommen;
返回&#39; 19.3571&#39;和
SELECT Leeftijd from (SELECT voornaam, achternaam, TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE()) AS Leeftijd FROM leiding) AS kolommen;
返回年龄列表,范围从25到18 有谁知道出了什么问题?提前谢谢!
答案 0 :(得分:0)
以前答案的组合应该有效:
SELECT
voornaam,
achternaam,
TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE()) AS Leeftijd
from
leiding
WHERE
TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE()) < (select AVG(TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE())) from leiding)
ORDER BY
Leeftijd
;
第一个是在WHERE子句中使用聚合函数,在SQL中是禁止的,第二个是使用HAVING作为WHERE,这只是坏事。哦,你把TIMESTAMPDIFF(YEAR,geboortedatum,CURDATE())作为Leeftijd获取,可能你的表中有你的名字列......
所以,这种组合应该适合你。
答案 1 :(得分:-1)
使用WHERE
代替HAVING
。 HAVING
与GROUP BY
关键字一起使用,而不是单一
所以写这个查询
SELECT * from (SELECT voornaam, achternaam, TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE())
AS Leeftijd FROM leiding)
AS kolommen
GROUP BY Leeftijd
HAVING Leeftijd < AVG(Leeftijd)
ORDER BY Leeftijd;
MySQL HAVING子句在SELECT语句中用于指定 过滤一组行或聚合的条件。
MySQL HAVING子句通常与GROUP BY子句一起使用。什么时候 使用GROUP BY子句,我们可以将过滤条件应用于 出现在GROUP BY子句中的列。如果是GROUP BY子句 省略,HAVING子句的行为类似于WHERE子句。
答案 2 :(得分:-1)
当您在查询中使用select avg(列)时,您获得行值的平均值,而不是所有行的平均值,因此您的查询应为:
SELECT * from (SELECT voornaam, achternaam, TIMESTAMPDIFF(YEAR, geboortedatum, CURDATE())
AS Leeftijd FROM leiding)
AS kolommen
HAVING Leeftijd < (select AVG(Leeftijd) from leiding)
ORDER BY Leeftijd;