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

时间:2014-04-16 02:32:49

标签: php mysql query-optimization

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

ID,性别,得分

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

我不想运行复杂的JOINS或多个查询“ID in ....”,因为这已经只是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查询

********* 我管理解决这个问题,这是一个简单的解决方案: ************

select会有条件if:

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

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

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

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

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

如果需要这些属性,您可以尝试:

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

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