Php 从两个不同的行中选择值

Php 从两个不同的行中选择值,php,mysql,sql,aggregate,Php,Mysql,Sql,Aggregate,我正在一张桌子上工作 课程编号:患者编号:效率评分 4871:32:99 4872:32:100 4872:32:50 我选择效率分数的PHP代码如下所示: while($row = mysql_fetch_assoc($result)){ $efficiency_score[$c][$k] = $row['efficiency_score']; } mysql_free_result($result); SELECT session_i

我正在一张桌子上工作

课程编号:患者编号:效率评分

4871:32:99

4872:32:100

4872:32:50

我选择效率分数的PHP代码如下所示:

while($row = mysql_fetch_assoc($result)){
            $efficiency_score[$c][$k] = $row['efficiency_score'];
        }
        mysql_free_result($result);
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 WHERE session_id >= 1000  /* or whatever filter criteria */
 GROUP BY session_id
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
HAVING MAX(efficiency_score) <= 80   /*or whatever filter criterion*/
这是在2个for循环中,它解释了多维数组

但是,该代码通过表中的每一行进行选择,我只需要最大值

efficiency_score
每人

session_id

我如何才能找到最大效率得分,并且每个会话id只有一个效率得分?

这很简单。使用聚合查询

SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
这是SQL完美而高效的一部分。如果你在
(session\u id,efficiency\u score)
上创建一个复合索引,这个查询会非常快,因为MySQL可以使用一个

您还可以使用聚合函数
MIN()
AVG()
STDDEV()
COUNT(*)
,等等

如果需要汇总表的子集,可以指定如下的
WHERE
子句:

while($row = mysql_fetch_assoc($result)){
            $efficiency_score[$c][$k] = $row['efficiency_score'];
        }
        mysql_free_result($result);
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 WHERE session_id >= 1000  /* or whatever filter criteria */
 GROUP BY session_id
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
HAVING MAX(efficiency_score) <= 80   /*or whatever filter criterion*/
如果要对聚合结果进行筛选,可以指定HAVING子句,如下所示:

while($row = mysql_fetch_assoc($result)){
            $efficiency_score[$c][$k] = $row['efficiency_score'];
        }
        mysql_free_result($result);
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 WHERE session_id >= 1000  /* or whatever filter criteria */
 GROUP BY session_id
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
HAVING MAX(efficiency_score) <= 80   /*or whatever filter criterion*/
选择会话id,MAX(效率分数)作为效率分数
从你的桌子上
按会话\u id分组

拥有最大(效率得分)这很容易。使用聚合查询

SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
这是SQL完美而高效的一部分。如果你在
(session\u id,efficiency\u score)
上创建一个复合索引,这个查询会非常快,因为MySQL可以使用一个

您还可以使用聚合函数
MIN()
AVG()
STDDEV()
COUNT(*)
,等等

如果需要汇总表的子集,可以指定如下的
WHERE
子句:

while($row = mysql_fetch_assoc($result)){
            $efficiency_score[$c][$k] = $row['efficiency_score'];
        }
        mysql_free_result($result);
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 WHERE session_id >= 1000  /* or whatever filter criteria */
 GROUP BY session_id
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
HAVING MAX(efficiency_score) <= 80   /*or whatever filter criterion*/
如果要对聚合结果进行筛选,可以指定HAVING子句,如下所示:

while($row = mysql_fetch_assoc($result)){
            $efficiency_score[$c][$k] = $row['efficiency_score'];
        }
        mysql_free_result($result);
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 WHERE session_id >= 1000  /* or whatever filter criteria */
 GROUP BY session_id
SELECT session_id, MAX(efficiency_score) AS efficiency_score
  FROM your_table
 GROUP BY session_id
HAVING MAX(efficiency_score) <= 80   /*or whatever filter criterion*/
选择会话id,MAX(效率分数)作为效率分数
从你的桌子上
按会话\u id分组

拥有最高效率(效率得分)你让自己太难了。您可以从MySQL获得结果,而无需使用循环

选择会话id,MAX(效率分数)作为效率分数
来自表1

按会话分组\u id

你太难了。您可以从MySQL获得结果,而无需使用循环

选择会话id,MAX(效率分数)作为效率分数
来自表1

按会话分组\u id

谢谢您,先生!我猜这也适用于只有一行的session_id?是的,它适用于任何数量的重复session_id值。我是否只需在GROUP BY之前或之后添加查询中的WHERE,或者这不重要?谢谢先生!我猜这也适用于只有一行的session_id?是的,它适用于任何数量的重复session_id值。我是在groupby之前还是之后添加查询中的WHERE,还是不重要?