Php Mysql条件最大值或最小值取决于另一列值
我想运行一个MYSQL查询,根据另一列的值获取一列的最大值或同一列的最小值。例如,假设我的表格是: 身份证、性别、分数 性别可以是“男孩”或“女孩”,我希望查询女孩的合计最高分数和男孩的最低分数 我不想运行复杂的联接或多个查询“where ID in…”,因为这已经只是带有联接的更复杂查询的一部分,我试图避免性能问题 我尝试了以下方法:Php Mysql条件最大值或最小值取决于另一列值,php,mysql,query-optimization,Php,Mysql,Query Optimization,我想运行一个MYSQL查询,根据另一列的值获取一列的最大值或同一列的最小值。例如,假设我的表格是: 身份证、性别、分数 性别可以是“男孩”或“女孩”,我希望查询女孩的合计最高分数和男孩的最低分数 我不想运行复杂的联接或多个查询“where ID in…”,因为这已经只是带有联接的更复杂查询的一部分,我试图避免性能问题 我尝试了以下方法: SELECT ... list of columns ... DB_User_ID ,
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',显然minu Boys_分数将为零,反之亦然。问题是-围绕这个查询是否有任何逻辑工作,只为女孩运行MAX条件,而只为男孩运行MIN条件
从逻辑上讲,我试图实现的目标(见下文)是:
但这不是一个合法的MYSQL查询
*********我设法解决了这个问题,这里有一个简单的解决方案:***************
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
如果出现以下情况,则select将有一个条件:
SELECT {column list}
IF(DB_Gender ='girl', MAX(DB_Score), MIN(DB_Score)) AS Min_Max_Scores
......
然后通过条件字段添加另一个组:
GROUP BY DB_User_ID, DB_Gender
结果是按性别分组的所有行,而最小最大分数将取决于性别
******我设法找到的另一个解决方案************
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
这将求出女孩的最大分数和男孩的最小分数之和假设用于驱动条件的列是二进制的,您可以通过将IFs组合在一起来解决这个问题,如下所示:
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
如果您只需要这些属性,可以尝试:
选择MAX(如果(DB_Gender='girl',DB_Score,0))作为MaxGirlScore,MIN(如果(DB_性别='boy',DB_分数,10000000))作为MinBoyScore
来自数据库 注意事项:
如果您试图获得每个女孩/男孩的最大/最小值,并且每个用户都有多个分数,那么这并不是您想要的。请注意,上述内容不适用任何语义分组。感谢您的及时回复。是否可以这样做-如果(DB_性别='girl',最大(DB_分数)作为最大分数,最小(DB_分数)作为最小分数?我现在正在尝试,所以。。。。您的回答很好,感谢您的及时回复@nickhamlin-但是-我希望将最大分数和最小分数分开,因为这些分数将用于女孩和男孩。这不是合法的MYSQL查询:如果(DB_Gender='girl',MAX(DB_Score)作为MAX_Girls_Score,MIN(DB_Score)作为MIN_Boys_Score),但这就是我试图实现的目标。