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 关键字