![](/img/trans.png)
[英]Howto display an SQL SUM query result (variable 1) with MIN, MAX and AVG values (variable 2) using PHP?
[英]MAX, SUM then AVG all in one SQL query?
这里需要复杂的 SQL 查询,不确定是否可能。
我有一张这样的表:
------------------------
|uid |lesson_id |score |
------------------------
|1 |0 |20 |
|1 |0 |25 |
|1 |0 |15 |
|1 |0 |40 |
|1 |1 |70 |
|1 |0 |10 |
|1 |1 |20 |
|1 |1 |55 |
|1 |1 |55 |
|1 |0 |5 |
|1 |2 |65 |
------------------------
对于特定用户,我需要获得每节课的最高分,将它们相加,然后得到它们的平均值……所有这些都在一个 SQL 查询中。
最高分数:
-----------------------
|lesson_id |max_score |
-----------------------
|0 |40 |
|1 |70 |
|2 |65 |
-----------------------
和:
------
|sum |
------
|175 |
------
平均数:
-------
|avg |
-------
|58.3 |
-------
这个怎么样?
SELECT uid AS id, AVG(max_score) AS avg_score FROM
(
SELECT uid, lesson_id, max(score) AS max_score FROM cdu_user_progress
WHERE session_id = $session_id
GROUP BY uid, lesson_id
) AS tt
WHERE uid IN ($ids)
GROUP BY uid
ORDER BY avg_score
您可以只使用子查询:
SELECT uid, SUM(MaxScore), Avg(MaxScore)
FROM
(
SELECT uid, lesson_id,max(score) as MaxScore
FROM scores
GROUP BY userid, lesson_id
) AS m
GROUP BY uid
或仅针对一位用户:
SELECT SUM(MaxScore), Avg(MaxScore)
FROM
(
SELECT lesson_id,max(score) as MaxScore
FROM scores
WHERE uid = $uid
GROUP BY lesson_id
) AS m
或者对于“一群特定用户”:
$uidlist = (comma-delimited list of user ids)
SELECT uid, SUM(MaxScore), Avg(MaxScore)
FROM
(
SELECT uid, lesson_id,max(score) AS MaxScore
FROM scores
WHERE FIND_IN_SET(uid, $uidlist)
GROUP BY uid, lesson_id
) AS m
GROUP BY uid
这是一个简单的示例SQLFIDDLE
select Avg(tt.maxscores) from (
select lesson_id,max(score) as maxscores
from t
group by lesson_id ) as tt
SELECT AVG( s.scores ) AS avarage, SUM( s.scores ) AS total
FROM (
SELECT lesson_id, MAX( score ) AS scores
FROM `tblScores`
GROUP BY lesson_id
) AS s
您可以在单个 SQL 查询中轻松完成此操作,尽管您将需要使用多个语句。
最容易的是,您可以通过子查询来完成此操作,尽管可以通过临时表或 Common-Table-Expression 来完成相同的结果。
(另外,请注意 SQL AVG
函数已经对结果求和并除以它们的计数。你不想做AVG(SUM(X))
,因为它会以一个无意义的数字结束。)无论如何,继续这个例子:
首先,编写一个 SQL 表达式来获取您将要平均的项目,例如每个用户每次测试的最大分数。
SELECT MAX(Score) As MaxScore, uid, lesson_id
FROM table
GROUP BY uid, lesson_id
然后,您将上面的 SELECT 视为一个表,并围绕它进行第二次选择以获得每个 uid 的平均 Max 分数。
SELECT AVG(MaxScore) as Final, uid
FROM (
SELECT MAX(Score) As MaxScore, uid, lesson_id
FROM table
GROUP BY uid, lesson_id
) AS subQuery
GROUP BY uid
您可以使用此方法轻松包含其他聚合函数,并且由于它相当标准,因此可以在大多数 SQL 服务器中使用。 但是,根据供应商,您可能有自定义语法来执行此操作,例如SQL Server 中的 OVER 和 Parition by
一切皆有可能,只是可能非常非常丑陋。 这是一个丑陋的代码示例,可以在单个查询中获得您想要的内容...
伪码查询:
SELECT lesson_id, max_score WHERE uid=X
UNION
SELECT -1, sum //done via nested query
UNION
SELECT -2, average //done via nested query
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.