2012-09-07 75 views
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如何使這個MySQL查詢工作?

簡短說明:

這裏的問題是,有兩個部分我需要執行此分級計算。一行,以及相關的行。 COUNT()函數搞亂了我的選擇。在子查詢中,它不允許我選擇開當前排名.id(外部查詢),因爲在過濾發生之前,COUNT函數將結果減少到一行。我需要的是以某種方式將id作爲參數傳遞給子查詢的WHERE子句。這只是獲得理想結果的一個想法,但如果您理解了應用程序,則可能有更好的方法(如下所述)。

朗說明:

Thie應用程序允許用戶排名涉及醫療的情況下,用於統計目的的意見。有兩種類型的排名按照相同的方式計算 - 預參考和後參考。這反映了用戶在看到引用(在案例表中)和之後選擇排列意見的方式。 opinion_list目前沒有使用。

排名表存儲了經歷排名過程的用戶的一個實例,而ranking_data表存儲了實際提交的數據。排名頁面要求用戶按照喜好排序,頂部是最好的。這個查詢應該計算Collabograde得分,這將是人們對他人看好的數量。

進入應用程序的用戶首先登錄,然後將自己的意見提交給案件,然後將他們的意見與已提交的意見進行排名。每個人都這樣做。例如,可以說我剛剛提交了我的意見並開始排名。有4個意見,包括我自己的系統,還沒有其他排名(儘管通常會有一個意見排名)。如果我將我的意見排在第二位,那麼我的Collabograde得分將是2/4。當用戶2經歷相同的排名過程並將我的觀點排在第一位時,它會變成3/8。

因此對於查詢,訂單爲0爲最好等等。該查詢應該計算一個用戶和一個案例的Collabograde分數。在先前的查詢中檢索用戶在案例中提交的opinion_id。我首先嚐試獲取所有排名中的opinion_id的位置,然後獲取當前所選排名行的排名數據行總數。我使用這些值來計算結果。 因此,我正在計算每個排名行中的一個「分數」,然後將它們平均到一起以創建整個案例的分數。

天才廣泛,我該怎麼辦?

+0

對不起 - 你的SQL格式是討厭我,所以我編輯了 - 希望你不介意 –

+0

添加ORDER BY排名。 ID在裏面選擇將使該查詢返回不同的排名.id – MimiEAM

+0

不是真的。很快我會讀一本專門的MySQL書籍,並學習正確的格式,等等。 – Waffles

回答

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};