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()函数搞乱了我的选择。在子查询中,它不允许我选择ON当前的rankings.id(外部查询),因为COUNT函数在过滤发生之前将结果减少到一行。我需要的是以某种方式将id作为参数传递给子查询的WHERE子句。这只是获得理想结果的一个想法,但如果您了解该应用程序可能会有更好的方法(如下所述)。
长解释:
该应用程序允许用户对与医疗案例相关的意见进行排名,以用于统计目的。有两种类型的排名以相同的方式计算 - 预参考和后参考。这反映了用户在看到参考(在案例表中)和之后的选择之前如何选择对意见进行排名。 views_list wer目前没有使用。
排名表存储经历排名过程的用户的一个实例,ranking_data表存储实际提交的数据。排名页面要求用户按优先顺序排序意见,最佳排名是最佳。该查询应该计算Collabograde得分,这将是人们偏爱他们对其他人的看法的数量。
首先登录应用程序的用户,然后向案例提交自己的意见,然后将他们的意见与已提交的其他人进行排名。每个人都这样做。 例如,假设我刚刚提交了我的意见并开始排名。在系统中有4个意见,包括我自己的意见,还没有其他排名(尽管每个意见通常会有一个排名)。如果我的评价排在第二位,那么我的Collabograde评分为2/4。当user2经历相同的排名过程并将我的意见排在第一位时,它就会变成3/8。
因此对于查询,订单为0表示最佳,依此类推。该查询应该计算一个用户和一个案例的Collabograde分数。在先前的查询中检索用户在该情况下的提交的opinion_id。我首先尝试在所有排名中获得该opinion_id的位置,然后我得到当前所选排名行的ranking_data行的总数。我使用这些值来计算结果。 所以我正在计算一个分数'每个排名行,然后将它们平均在一起以创建整个案例的分数。
天才广泛,我该怎么办?
答案 0 :(得分: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};