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