【发布时间】: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
这将总结女孩的最高分数和男孩的最低分数
【问题讨论】:
标签: php mysql query-optimization