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

SQL Get MIN() and MAX() with INNER JOIN

此代码有问题

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) 并获取我创建的 table 的 MIN() 和 MAX() 值INNER JOIN,但是我得到的结果只显示了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

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

您必须按您想要汇总结果的 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

子查询部分 returns berkas_nomor 明智的最小值和最大值以及与主要 table berkas 的 JOIN。

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;

如果您在 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 标准,您可以在其中按主键聚合但仍使用指定 table.

中的任何列