繁体   English   中英

子查询的 MySQL select MAX 值仅返回外部查询的一个结果。 为什么?

[英]MySQL select MAX value from subquery only returns one results from outer query. Why?

(使用 MariaDB 5.5
我知道这是旧的,但它是第 3 方服务器,我无法更新它

我有一个带有日期/年份列的数据表。 我需要根据参考 ID 列出所有值,但仅限于最近一年。

根据我最近关于子查询的问题,我认为这将是一个使用带有MAX()选择的子查询的简单案例,但只会返回一个结果。 为什么? 以及如何获得完整的结果集。

桌子:

 create table ee_stats
(
    stat_id int(8) unsigned auto_increment
        primary key,
    ee_id smallint(6) unsigned null,
    ref_id int null comment 'external table reference.',
    date_year year null,
    value_counter int(8) unsigned null,
    value_percentage double(6,3) unsigned null 
)

数据

stat_id | ee_id | ref_id | date_year | value_counter | value_percentage
------------------------------------------------------------------------
    301 |   32  |   14   |      2020 |      0        |         0
    302 |   32  |   1    |      2020 |      0        |         0
    303 |   32  |   21   |      2020 |      0        |         0
    304 |   32  |   22   |      2020 |      0        |         0
    305 |  464  |   17   |      2020 |      40       |         3
    306 |  464  |   18   |      2020 |      0        |         0
    307 |  464  |   20   |      2020 |      0        |         0
    308 |  464  |   2    |      2020 |      87       |        6.6
    309 |  464  |   19   |      2020 |      0        |         0
    310 |  464  |   7    |      2020 |      15       |        1.1
    311 |  464  |   10   |      2020 |      29       |        2.2
    312 |  464  |   11   |      2019 |      29       |        2.2
    313 |  464  |   16   |      2019 |      13       |        1.0
    314 |  464  |   7    |      2019 |     116       |        8.8
    315 |  464  |   19   |      2019 |      71       |        5.3
    316 |  464  |   4    |      2019 |      67       |         5

预期结果是 select 所有ee_id = 464的值和有记录的最近一年( 2020 )。

我的查询

SELECT es.stat_id, es.ee_id, es.ref_id, es.date_year, es.value_count,
       es.value_percentage, eed.descr
FROM ee_stats es
         LEFT JOIN ee_descriptor eed on es.ref_id = eed.id
WHERE es.ee_id = 464 AND es.date_year = (
    SELECT MAX(zz.date_year) FROM ee_stats zz WHERE zz.ee_id = es.ee_id
    )

但这仅返回第一个外部结果:

 305 | 464 | 17 | 2020 | 40 | 3

我的尝试

子查询在独立运行时正确返回值2020 (替换外部值)。 这个问题非常相似,但这个答案似乎正是应该在这里工作的。

作品:

SELECT es.stat_id, es.ee_id, es.ref_id, es.date_year, es.value_count,
       es.value_percentage, eed.descr
FROM ee_stats es
         LEFT JOIN ee_descriptor eed on es.ref_id = eed.id
WHERE es.ee_id = 464 AND es.date_year = '2020'

这有效:

SELECT es.stat_id, es.ee_id, es.ref_id, es.date_year, es.value_count,
       es.value_percentage, eed.descr
FROM ee_stats es
         LEFT JOIN ee_descriptor eed on es.ref_id = eed.id
WHERE es.ee_id = 464 AND es.date_year = (
    SELECT MAX(zz.date_year) FROM ee_stats zz WHERE zz.ee_id = '464'
    )

但不知何故,对ee_id值的动态外部引用仅在 SQL 上返回一个结果。

预期结果:

    305 |  464  |   17   |      2020 |      40       |         3
    306 |  464  |   18   |      2020 |      0        |         0
    307 |  464  |   20   |      2020 |      0        |         0
    308 |  464  |   2    |      2020 |      87       |        6.6
    309 |  464  |   19   |      2020 |      0        |         0
    310 |  464  |   7    |      2020 |      15       |        1.1
    311 |  464  |   10   |      2020 |      29       |        2.2

我知道了!

我发现我必须将 MAX 实体转换为正确的格式; 所以我不得不将它转换为 DATE 格式。

CAST(MAX(zz.date_year) AS DATE)

这行得通。

SELECT es.stat_id, es.ee_id, es.ref_id, es.date_year, es.value_count,
       es.value_percentage, eed.descr
FROM ee_stats es
         LEFT JOIN ee_descriptor eed on es.ref_id = eed.id
WHERE es.ee_id = 464 AND es.date_year = (
    SELECT CAST(MAX(zz.date_year) AS DATE) FROM ee_stats zz WHERE zz.ee_id = es.ee_id
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM