SQL 使用 INNER JOIN 获取 MIN() 和 MAX()

Posted

技术标签:

【中文标题】SQL 使用 INNER JOIN 获取 MIN() 和 MAX()【英文标题】:SQL Get MIN() and MAX() with INNER JOIN 【发布时间】:2021-10-18 05:51:59 【问题描述】:

这段代码有问题

SELECT b.*, MIN(c.seri) as seri_awal, MAX(c.seri) as seri_akhir FROM berkas b
LEFT JOIN certificate c
    ON c.berkas_nomor = b.nomor

使用该代码,我想我可以获得与我创建的关系 (c.berkas_nomor = b.nomor) 相关的所有数据,并获得我 INNER JOIN 的表的 MIN() 和 MAX() 值,但结果我get 只显示 1 个数据(我的期望应该是 4 个数据)

我的预期结果

nomor nama seri_awal seri_akhir
ASD123 lorem S0000001 S0000015
ASD321 ipsum S1000500 S1000525
QWE123 dolor S3000500 S3000525
QWE321 ameti S4000001 S4000015

实际结果

nomor nama seri_awal seri_akhir
ASD123 lorem S0000001 S0000015

我写的代码有问题吗?谢谢

【问题讨论】:

您的查询无效。我建议您SET sql_mode = 'ONLY_FULL_GROUP_BY'; 以避免编写此类无效查询。 【参考方案1】:

您必须按您想要聚合结果的 2 列进行分组:

SELECT b.nomor, b.nama, 
       MIN(c.seri) as seri_awal, 
       MAX(c.seri) as seri_akhir 
FROM berkas b LEFT JOIN certificate c
ON c.berkas_nomor = b.nomor
GROUP BY b.nomor, b.nama

【讨论】:

【参考方案2】:

子查询部分返回 berkas_nomor 明智的最小值和最大值,并与主表 berkas 联接。

SELECT b.nomor, b.nama, t.seri_awal, t.seri_akhir
FROM berkas b
LEFT JOIN (SELECT berkas_nomor
                , MIN(seri) seri_awal
                , MAX(seri) seri_akhir
           FROM certificate
           GROUP BY berkas_nomor) t
      ON b.nomor = t.berkas_nomor;

【讨论】:

【参考方案3】:

如果您在berkas 中有一个primary key,那么您可以将其用于聚合:

SELECT b.*, MIN(c.seri) as seri_awal, MAX(c.seri) as seri_akhir
FROM berkas b LEFT JOIN
     certificate c
     ON c.berkas_nomor = b.nomor
GROUP BY b.nomor;

mysql 支持 SQL 标准,您可以通过主键进行聚合,但仍使用指定表中的任何列。

【讨论】:

以上是关于SQL 使用 INNER JOIN 获取 MIN() 和 MAX()的主要内容,如果未能解决你的问题,请参考以下文章

带有 INNER JOIN 和 WHERE 的 SQL 查询

SQL中inner join,outer join和cross join的区别

如何将 SQL Inner Join、Group By 转换为 Linq?

关于SQL数据库中cross join 和inner join用法上的区别?

SQL JOINSQL INNER JOIN 关键字SQL LEFT JOIN 关键字SQL RIGHT JOIN 关键字SQL FULL JOIN 关键字

SQL中inner join,outer join和cross join的区别