我这里有两张桌子
BIODATA
ID NAME
1 A
2 B
YEAR
ID JOIN YEAR GRADUATE YEAR
1 1990 1991
2 1990 1993
我已经使用
了select
NAME,
max(year(JOIN_YEAR) - year(GRADUATE_YEAR)) as MAX
from
DATA_DIRI
right join DATA_KARTU
ON BIODATA.ID = YEAR.ID;
但结果变成了:
+--------+------+
| NAME | MAX |
+--------+------+
| A | 3 |
+--------+------+
我已经尝试了很多不同类型的连接,但我仍然无法找到NAME如何成为“B”。有人可以帮帮我吗?非常感谢
答案 0 :(得分:2)
如果您一次在选择集中使用聚合和非聚合,则用于非聚合字段的行基本上是随机选取的。
基本上,max是如何工作的 - 它通过查询收集每个组的所有行(如果没有group by,all all),计算max并将其放入结果中。
但是既然你也放入了一个非聚合字段,它需要一个值 - 所以SQL所做的就是选择一个随机行。你可能会想'好吧,为什么它不选择同一行max?'但如果你使用avg或count怎么办?它们没有与之关联的行,因此它能做的最好是随机选择。这就是为什么这种行为一般存在的原因。
您需要做的是使用子查询。像select d1.id from data_diri d1 where d1.graduate_year - d1.join_year = (select max(d2.graduate_year - d2.join_year from data_diri d2))