1
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 行总数。我使用这些值来计算结果。因此,我正在计算每个排名行的“分数”,然后将它们平均在一起以创建整个案例的分数。

天才四面八方,我能做什么?

4

1 回答 1

2

您想按 对子查询进行分组rankings.id,因此添加GROUP BY rankings.id

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}
    GROUP BY rankings.id
) AS total_table ON total_table.id = rankings.id
WHERE case_id = {$case_id};
于 2012-09-07T09:35:50.833 回答