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

簡単な説明:

ここでの問題は、このグレーディング計算を実行するために必要な2つの部分があることです。1つの行、および関連する行の合計。COUNT()関数が私の選択を台無しにしています。サブクエリでは、(外部クエリの)現在のrankings.idを選択できません。これは、COUNT関数が、フィルタリングが行われる前に結果を1行に減らすためです。私が必要としているのは、サブクエリのWHERE句のパラメータとしてidをなんとかして渡すことです。これは、目的の結果を得るための1つのアイデアにすぎませんが、アプリケーションを理解していれば、より良い方法があるかもしれません(以下で説明します)。

長い説明:

このアプリケーションを使用すると、ユーザーは統計目的で医療ケースに関連する意見をランク付けできます。同じ方法で計算されるランキングには、事前参照と事後参照の2種類があります。これは、ユーザーが参照(ケーステーブルの場合)を見る前とその後に意見をランク付けすることを選択した方法を反映しています。現時点では、opinion_listwerは使用していません。

ランキングテーブルには、ランキングプロセスを実行しているユーザーの1つのインスタンスが格納され、ranking_dataテーブルには実際に送信されたデータが格納されます。ランキングページでは、ユーザーに好みの順に意見を並べてもらいます。一番上が一番です。このクエリは、コラボグレードスコアを計算することになっています。これは、人々が他の人よりも自分の意見を支持した量です。

アプリに最初にログインしたユーザーは、自分の意見をケースに送信し、すでに送信された他のユーザーに対して自分の意見をランク付けします。誰もが同じことをします。たとえば、自分の意見を送信してランキングを開始したとします。システムには私自身を含む4つの意見があり、他のランキングはまだありません(ただし、通常、意見ごとに1つのランキングがあります)。自分の意見を2番目にランク付けした場合、コラボグレードのスコアは2/4になります。user2が同じランキングプロセスを経て、私の意見を最初に最高にランク付けすると、3/8になります。

したがって、クエリの場合、順序は0で最適です。クエリは、1人のユーザーと1つのケースのコラボグレードスコアを計算することになっています。ケースでのユーザーの送信のopinion_idは、前のクエリで取得されます。最初にすべてのランキングでそのopinion_idの位置を取得しようとし、次に現在選択されているランキング行のranking_data行の総数を取得します。これらの値を使用して結果を計算します。したがって、ランキング行ごとに1つの「スコア」を計算し、それらを平均して、ケース全体のスコアを作成します。

はるかに広い天才、私は何ができますか?

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 に答える