如何使这个 MySQL 查询工作?

Posted

技术标签:

【中文标题】如何使这个 MySQL 查询工作?【英文标题】:How do I make this MySQL query work? 【发布时间】:2012-08-31 22:48:02 【问题描述】:
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 子句。这只是获得所需结果的一种想法,但如果您了解应用程序(如下所述),可能会有更好的方法。

详细解释:

Thie 应用程序允许用户对与医疗案例相关的意见进行排名,以用于统计目的。有两种类型的排名以相同的方式计算 - 参考前和参考后。这反映了用户在看到参考文献(在案例表中)之前和之后如何选择对意见进行排名。目前没有使用意见列表。

rankings 表存储一个用户经过排序过程的实例,ranking_data 表存储实际提交的数据。排名页面要求用户按偏好顺序排列意见,顶部是最好的。这个查询应该计算 Collabograde 分数,这将是人们更喜欢他们的意见而不是其他人的分数。

进入应用程序的用户首先登录,然后提交自己对案例的意见,然后将他们的意见与其他已提交的意见进行排名。每个人都这样做。 例如,假设我刚刚提交了我的意见并开始排名。系统中有 4 个意见,包括我自己的意见,目前还没有其他排名(尽管每个意见通常会有一个排名)。如果我将我的意见排在第二好,那么我的 Collabograde 分数将是 2/4。当 user2 经历相同的排名过程并首先对我的意见进行排名时,它变成了 3/8。

所以对于查询,顺序为 0 表示最佳,依此类推。该查询应该计算一个用户和一个案例的 Collabograde 分数。在之前的查询中检索到用户在案例中提交的意见id。我首先尝试获取该 opinion_id 在所有排名中的位置,然后获取当前选择的排名行的ranking_data 行总数。我使用这些值来计算结果。 因此,我计算每个排名行的一个“分数”,然后将它们平均在一起以创建整个案例的分数。

天才无数,我能做什么?

【问题讨论】:

对不起 - 你的 SQL 格式让我很烦,所以我编辑了它 - 希望你不介意 在内部选择中添加 ORDER BY rankings.id 将使该查询返回不同的rankings.id 并非如此。很快,我将阅读一本专门的 MySQL 书籍并学习正确的格式设置等。 是的,所以total_table 将是一个具有不同rankings.id 和每个计数的表 @MimiEAM 我说的是上面的帖子 =) 感谢您的建议。您能否发布修改后的查询作为答案? 【参考方案1】:

您想将子查询分组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;

【讨论】:

以上是关于如何使这个 MySQL 查询工作?的主要内容,如果未能解决你的问题,请参考以下文章

这个 mysql 查询是如何工作的?

如何使查询工作?

如何使用媒体查询或运算符使 SASS 嵌套嵌套媒体查询工作

我不能让这个查询工作......'mysql''phpmyadmin'

如何使 MySQL Connector/J 在 android 上工作?

默认情况下,条件使用“内连接”而不是“左连接”方法使我的查询工作不是我计划的方式