【问题标题】:SQL Get MIN() and MAX() with INNER JOINSQL 使用 INNER JOIN 获取 MIN() 和 MAX()
【发布时间】: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'; 以避免编写此类无效查询。

标签: mysql sql group-by max min


【解决方案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 标准,您可以通过主键进行聚合,但仍使用指定表中的任何列。

      【讨论】:

        猜你喜欢
        • 2019-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多