我想运行一个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
这将总结女孩的最高分数和男孩的最低分数
答案 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
注意事项: 如果你想要获得每个女孩/男孩的最大/分钟,并且每个用户有多个分数,这不是你想要的。请注意,上述内容不适用于任何分组语义。