如何获得 MySQL JOIN 的结果,其中记录符合联接表中的值标准?

Posted

技术标签:

【中文标题】如何获得 MySQL JOIN 的结果,其中记录符合联接表中的值标准?【英文标题】:How do I get results of a MySQL JOIN where records meet a value criteria in joined table? 【发布时间】:2021-12-17 06:55:41 【问题描述】:

这可能很简单,但我想不通......

我有两张桌子:

tbl_results:

runID | balance |
1     | 3432
2     | 5348
3     | 384 

tbl_phases:

runID_fk | pc |
1        | 34 
1        | 2
1        | 18
2        | 15
2        | 18
2        | 20
3        | -20
3        | 10
3        | 60

我想获得一个记录集:runID, balance, min(pc), max(pc) 其中 pc>10 和 pc 对于每个 runID作为一个组,不包括任何关联的 pc 值超出值范围的 runID。

我希望从上述内容中得到以下结果:

runID | balance | min_pc | max_pc
2     | 5348    | 15     | 20

...因为 runID=1&3 的 pc 值超出了上述 pc 的数值范围。

提前致谢!

【问题讨论】:

需要 min(pc) > 10 AND max(pc) 【参考方案1】:

您可以根据您的要求在您的having 子句中应用过滤器。您可以尝试以下方法。

查询 #1

SELECT
    r.runID,
    MAX(r.balance) as balance,
    MIN(p.pc) as min_pc,
    MAX(p.pc) as max_pc
FROM
    tbl_results r
INNER JOIN 
    tbl_phases p ON p.runID_fk = r.runID
GROUP BY 
    r.runID
HAVING
    MIN(p.pc)>10 AND MAX(p.pc) < 50;
runID balance min_pc max_pc
2 5348 15 20

查询 #2

SELECT
    r.runID,
    MAX(r.balance) as balance,
    MIN(p.pc) as min_pc,
    MAX(p.pc) as max_pc
FROM
    tbl_results r
INNER JOIN 
    tbl_phases p ON p.runID_fk = r.runID
GROUP BY 
    r.runID
HAVING
    COUNT(CASE WHEN p.pc <= 10 or p.pc >= 50 THEN 1  END) =0;
runID balance min_pc max_pc
2 5348 15 20

View working demo on DB Fiddle

使用 Rahul Biswas 的 cmets 更新

【讨论】:

以上是关于如何获得 MySQL JOIN 的结果,其中记录符合联接表中的值标准?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 的某个范围内获得结果,其中某些字段有字母?

MySql的join(连接)查询 (三表 left join 写法)

MySQL JOIN / UNION DISTINCT 问题

MySql INNER JOIN三表联查性能如何提升

MySQL中join连接,内连接,外连接,连接算法,优化

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]