mysql - 分组最大 mysql 查询忽略 NULL 列

标签 mysql mariadb

我有一张 table ,里面有汽车。每辆车都有一个唯一的id,以及其他与汽车统计信息相关的列。我想展示最快的 10 辆汽车。如果一辆车有相同的 Trim + ModelID + MakeID,我只想显示最新的车。

示例:

Year Make    Model  Trim  Time060
--------------------------------
2017 Bugatti Chiron null  2.3
2018 Bugatti Chiron null  2.3

我的问题是,如果 Trim 为 null,则 2017 年和 2018 年都不会显示。如果装饰不为空并且相同,我正确地获得了 2018 年的汽车。

这是我的查询:

 SELECT stats.* 
   FROM stats 
NATURAL 
   JOIN
      ( SELECT MakeID
             , ModelID
             , Trim
             , MAX(Year) AS Year 
          FROM stats 
         GROUP 
            BY Trim
             , ModelID
             , MakeID
      ) t
  ORDER 
     BY Time060 
  LIMIT 10

我尝试使用...(SELECT MakeID, ModelID, IFNULL(Trim, 'temp_trim') AS Trim, MAX(Year) AS Year FROM stats GROUP BY Trim, ModelID, MakeID)... ,但这也不起作用。

最佳答案

使用NOT EXISTS空安全等于运算符 <=> 检查 NULL 是否相等s:

select s.* from stats s
where not exists (
  select 1 from stats
  where makeid = s.makeid and modelid = s.modelid and trim <=> s.trim and year > s.year
)

请参阅demo .

或者:

select s.* from stats s
where s.year = (
  select max(year) 
  from stats
  where makeid = s.makeid and modelid = s.modelid and trim <=> s.trim
)

请参阅demo .

或者使用连接:

select s.* 
from stats s inner join (
  select makeid, modelid, trim, max(year) year
  from stats
  group by makeid, modelid, trim
) t on t.makeid = s.makeid and t.modelid = s.modelid and t.trim <=> s.trim and t.year = s.year

请参阅demo .

由于您对性能感兴趣,因此如果您的 MySql/MariaDB 版本支持窗口函数,请检查另一个选项:

select t.year, t.makeid, t.modelid, t.trim, t.time060
from (
  select s.*,
    row_number() over (partition by makeid, modelid, trim order by year) rn
  from stats s  
) t
where t.rn = 1

请参阅demo .

关于mysql - 分组最大 mysql 查询忽略 NULL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59593451/

相关文章:

mysql - 如何重新复制被忽略的表

MySQL 无法替换换行符

php - 解析 JSON 以在 PHP 中创建 SQL 插入语句

mysql - 如何根据mysql中的值获取平均值

mysql - 无法使用内联密码访问 MYSQL

mysql - 如何重新加载数据库表中的数据?

mariadb - 允许 MariaDB 10.3 中的特定用户进行外部访问

php - mysql_num_rows 返回 0,但数据存在于数据库中

mysql - Docker Linux 上的 MariaDB 在外部/内部 IP 之间有两个不同的版本

mysql - 这个查询真的不安全吗?