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()的主要内容,如果未能解决你的问题,请参考以下文章