首页 > 解决方案 > Mysql子查询中MAX的使用

问题描述

为什么我不能使用返回组错误的子查询?

SELECT hs.dateFin, hs.codeAdherent, hs.codeArticle 
FROM hs 
WHERE hs.codeFamilleArticle IN ('CNI', 'COT', 'ABO', 'ABOW',
                                'CNIW', 'O&T', 'EPH', 'TAX') 
AND codeAdherent != 0 
AND MAX(hs.dateFin) BETWEEN '2017-01-01' 
                        AND '2017-12-31'
GROUP BY hs.codeAdherent

2018-01-01 和 2018-12-31 存在相同的数据,但我只想获得 2017 年结束的数据。这里是包含 140000 个原始数据的表格样本(未显示所有列)。

这里

codeAdherent A 有 2018、2017、2016 年的数据。

codeAdherent B 有 2018 年、2017 年的数据

codeAdherent C 仅适用于 2017 年。

如果我在 2017 年进行选择,我会得到所有三个 codeAdherent,那么 MAX BETWEEN 将排除 A 和 B ......但这不起作用

标签: mysqlmax

解决方案


您可以使用NOT EXISTS检查 2018 年是否不存在记录:

SELECT dateFin, codeAdherent, codeArticle
FROM hs AS t
WHERE codeFamilleArticle IN ('CNI', 'COT', 'ABO', 'ABOW', 'CNIW', 'O&T', 'EPH', 'TAX')
AND codeAdherent != 0
-- filter 2017 rows
AND dateFin >= '2017-01-01'
AND dateFin <  '2018-01-01'
-- filter rows where 2018 data does not exist
AND NOT EXISTS (
    SELECT 1
    FROM hs
    WHERE codeAdherent = t.codeAdherent
    AND dateFin >= '2018-01-01'
)

推荐阅读