Mysql 条件 MAX 或 MIN 依赖于另一列值

Posted

技术标签:

【中文标题】Mysql 条件 MAX 或 MIN 依赖于另一列值【英文标题】:Mysql conditional MAX or MIN dependent on another column value 【发布时间】:2014-04-16 02:32:48 【问题描述】:

我想运行一个 mysql 查询,获取一列的 MAX 或同一列的 MIN,条件是 ANOTHER 列的值。例如,假设我的表是:

ID、性别、分数

性别可以是“男孩”或“女孩”,我希望查询女孩的综合 MAX 分数和男孩的 MIN 分数

我不想运行复杂的 JOINS 或多个查询“其中 ID 在....”,因为这已经只是更复杂的 JOIN 查询的一部分,我试图避免性能问题。

我尝试了以下方法:

SELECT  ... list of columns ...                     
    DB_User_ID ,                            
    DB_Gender ,
    IF(DB_Gender ='girl', MAX(DB_Score), 0) AS Max_Girls_Score,
    IF(DB_Gender ='boy', MIN(DB_Score), 0) AS Min_Boys_Score,
    FROM DB
    JOIN .... and continue of query ....
    GROUP BY DB_User_ID 

上述查询将无法正常工作,因为如果 DB_Gender = 'girl' 显然 Min_Boys_Score 将归零,反之亦然。问题是 - 围绕这个查询是否有任何合乎逻辑的工作,只为女​​孩运行 MAX 条件,只为男孩运行 MIN 条件?

从逻辑上讲,我想要实现的(见下文)是:

SELECT .....
IF(DB_Gender ='girl', MAX(DB_Score) AS Max_Girls_Score, MIN(DB_Score) AS Min_Boys_Score)

但这不是合法的 MYSQL 查询

************ 我设法解决了这个问题,这是一个简单的解决方案:************

选择将有条件 if:

SELECT column list
    IF(DB_Gender ='girl', MAX(DB_Score), MIN(DB_Score)) AS Min_Max_Scores
......

然后添加另一个 GROUP BY 条件字段:

GROUP BY DB_User_ID, DB_Gender

结果是所有行,按性别分组,而 Min_MAx_Scores 将取决于性别的 MAX 或 MIN

***** 我想出的另一个解决方案************

SELECT ......
SUM(IF(DB_Gender ='girl',MAX(DB_Score),0) AS Max_Girls_Score,
SUM(IF(DB_Gender = 'boy',MIN(DB_Score),0) AS Min_Boys_Score

这将总结女孩的最高分数和男孩的最低分数

【问题讨论】:

【参考方案1】:

假设您用来驱动条件的列是二进制的,您可以通过将 IF 组合在一起来解决这个问题,如下所示:

SELECT  ... list of columns ...                     
DB_User_ID ,                            
DB_Gender ,
IF(DB_Gender ='girl', MAX(DB_Score), MIN(DB_Score) AS Score,
FROM DB
JOIN .... and continue of query ....
GROUP BY DB_User_ID 

【讨论】:

感谢您的及时回复。是否可以这样做 - IF(DB_Gender ='girl', MAX(DB_Score) AS Max_Score, MIN(DB_Score) AS Min_Score) ?我现在正在尝试这个 所以....您的回答很好,感谢@nickhamlin 的及时回复-但是-我希望将最高分数和最低分数分开,因为这些分数将用于女孩和男孩.这不是合法的 MYSQL 查询:IF(DB_Gender ='girl', MAX(DB_Score) AS Max_Girls_Score, MIN(DB_Score) AS Min_Boys_Score) 但这就是我想要实现的目标。【参考方案2】:

如果你想要这些属性,你可以试试:

选择 MAX(if(DB_Gender='girl', DB_Score, 0)) AS MaxGirlScore, MIN(if(DB_Gender='boy', DB_Score, 10000000)) 作为 MinBoyScore 来自数据库

注意事项: 如果您试图获得每个女孩/男孩的最大值/最小值,并且每个用户有多个分数,那么这并不是您想要的。请注意,上述内容不适用任何分组语义。

【讨论】:

以上是关于Mysql 条件 MAX 或 MIN 依赖于另一列值的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用依赖于另一列的值的复杂函数聚合时间序列

添加依赖于另一列和子集的列(使用tidyverse)

如何使一个材料表列的编辑模式字段类型依赖于另一列的值,而不影响其他行?

允许Shiny numericInput依赖于另一个numericInput

依赖于另一个小部件值的 Dojo 验证

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中