SELECT ROUND(AVG(((total - `order`) / total) * 100), 2) AS score
FROM rankings
INNER JOIN ranking_data
ON ranking_id = rankings.id
AND opinion_id = {$opinion_id}
AND `type` = '{$type}'
INNER JOIN (
SELECT rankings.id, COUNT(*) as total
FROM rankings
INNER JOIN ranking_data
ON ranking_id = rankings.id AND `type` = '{$type}'
WHERE case_id = {$case_id}
) AS total_table ON total_table.id = rankings.id
WHERE case_id = {$case_id};
MySQL 表: http: //pastebin.com/jKvUrrNi
简短说明:
这里的问题是我需要两个部分来执行这个评分计算。一行,以及总共相关的行。COUNT() 函数弄乱了我的选择。在子查询中,它不允许我选择当前的rankings.id(外部查询的),因为 COUNT 函数在过滤发生之前将结果减少到一行。我需要以某种方式将 id 作为参数传递给子查询的 WHERE 子句。这只是获得所需结果的一个想法,但如果您了解应用程序(如下所述),可能会有更好的方法。
长解释:
该应用程序允许用户对与医疗案例相关的意见进行排名,以用于统计目的。有两种类型的排名以相同的方式计算 - 参考前和参考后。这反映了用户在看到参考文献(在案例表中)之前和之后如何选择对意见进行排名。目前没有使用意见列表。
排名表存储一个用户经过排名过程的实例,ranking_data 表存储实际提交的数据。排名页面要求用户按偏好顺序排列意见,顶部是最好的。这个查询应该计算 Collabograde 分数,这将是人们更喜欢他们的意见而不是其他人的数量。
进入应用程序的用户首先登录,然后提交自己对案例的意见,然后将他们的意见与其他已提交的意见进行排名。每个人都这样做。例如,假设我刚刚提交了我的意见并开始排名。系统中有 4 个意见,包括我自己的意见,目前还没有其他排名(尽管每个意见通常会有一个排名)。如果我将我的意见排在第二好,那么我的 Collabograde 分数将是 2/4。当 user2 经历相同的排名过程并首先对我的意见进行排名时,它变成了 3/8。
因此对于查询,order 为 0 表示最佳,依此类推。该查询应该计算一个用户和一个案例的 Collabograde 分数。在之前的查询中检索到用户在案例中提交的意见id。我首先尝试获取该 opinion_id 在所有排名中的位置,然后获取当前选择的排名行的ranking_data 行总数。我使用这些值来计算结果。因此,我正在计算每个排名行的“分数”,然后将它们平均在一起以创建整个案例的分数。
天才四面八方,我能做什么?