Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql条件最大值或最小值取决于另一列值_Php_Mysql_Query Optimization - Fatal编程技术网

Php Mysql条件最大值或最小值取决于另一列值

Php Mysql条件最大值或最小值取决于另一列值,php,mysql,query-optimization,Php,Mysql,Query Optimization,我想运行一个MYSQL查询,根据另一列的值获取一列的最大值或同一列的最小值。例如,假设我的表格是: 身份证、性别、分数 性别可以是“男孩”或“女孩”,我希望查询女孩的合计最高分数和男孩的最低分数 我不想运行复杂的联接或多个查询“where ID in…”,因为这已经只是带有联接的更复杂查询的一部分,我试图避免性能问题 我尝试了以下方法: SELECT ... list of columns ... DB_User_ID ,

我想运行一个MYSQL查询,根据另一列的值获取一列的最大值或同一列的最小值。例如,假设我的表格是:

身份证、性别、分数

性别可以是“男孩”或“女孩”,我希望查询女孩的合计最高分数和男孩的最低分数

我不想运行复杂的联接或多个查询“where ID in…”,因为这已经只是带有联接的更复杂查询的一部分,我试图避免性能问题

我尝试了以下方法:

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),但这就是我试图实现的目标。