gpt4 book ai didi

Mysql使用GROUP BY和MAX查询,返回错误结果

转载 作者:行者123 更新时间:2023-11-29 09:31:31 25 4
gpt4 key购买 nike

我的查询结果很奇怪:

SELECT 
veicoli_ID,
MAX(DataScadenzaRevisione) AS mmax,
EsitoPositivo AS StatoUltimaRevisione
FROM revisioni_veicolo
GROUP BY veicoli_ID
HAVING StatoUltimaRevisione = 1

我在这里创建了 fiddle :

http://sqlfiddle.com/#!9/4d97cd/1

为什么 StatoUltimaRevisione 列返回始终为 true?我认为 ID 20 和 26 一定是错误的。

预期(没有:拥有 StatoUltimaRevisione = 1):

veicoli_ID     mmax     StatoUltimaRevisione
6 2019-08-01 true
7 2018-04-09 true
20 2018-12-01 false
26 2020-10-01 false
44 2019-09-01 true
45 2020-05-01 true

最佳答案

根据 documentation,您得到的结果“正确” .
但您尝试应用的逻辑不起作用。
您在 SELECT 列表中的列 EsitoPositivo 未包含在 GROUP BY 子句中,并且未聚合(与 MIN MAXSUM 等),并且您认为为 EsitoPositivo 列返回的值将是具有以下内容的行中的值: MAX(DataScadenzaRevisione),但无法保证这一点
为什么?因为:

...the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic...

因此,为 EsitoPositivo 选择的值是其所属组中的任何值。

您必须通过使用表与仅返回 veicoli_IDMAX(DataScadenzaRevisione) 的查询的联接来更改查询的逻辑:

SELECT r.veicoli_ID, g.mmax, r.EsitoPositivo AS StatoUltimaRevisione 
FROM revisioni_veicolo r INNER JOIN (
SELECT veicoli_ID, MAX(DataScadenzaRevisione) AS mmax
FROM revisioni_veicolo
GROUP BY veicoli_ID
) g ON g.veicoli_ID = r.veicoli_ID AND g.mmax = r.DataScadenzaRevisione

或使用NOT EXISTS:

SELECT 
r.veicoli_ID,
r.DataScadenzaRevisione AS mmax,
r.EsitoPositivo AS StatoUltimaRevisione
FROM revisioni_veicolo r
WHERE NOT EXISTS (
SELECT 1 FROM revisioni_veicolo
WHERE veicoli_ID = r.veicoli_ID AND DataScadenzaRevisione > r.DataScadenzaRevisione
)

请参阅demo .
结果:

> veicoli_ID | mmax       | StatoUltimaRevisione
> ---------: | :--------- | -------------------:
> 6 | 2019-08-01 | 1
> 7 | 2018-04-09 | 1
> 20 | 2018-12-01 | 0
> 26 | 2020-10-01 | 0
> 44 | 2019-09-01 | 1
> 45 | 2020-05-01 | 1

关于Mysql使用GROUP BY和MAX查询,返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58608100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com