2017-07-04 32 views
1
 RATING 
[ id - pid = rate] 
[ 1 - 1 - 5 ] 
[ 2 - 1 - 5 ] 
[ 3 - 1 - 4 ] 
[ 4 - 1 - 1 ] 
[ 5 - 1 - 1 ] 

WHERE pid = 1; 
$r5 = 10; 
$r4 = 4; 
$r3 = 0; 
$r2 = 0; 
$r1 = 2; 
$tt = 16; 

從該表中有5分的評價公式我試圖使這個數學公式在SQL查詢

($r5*5 + $r4*4 + $r3*3 + $r2*2 + $r1)/$tt 

,而不是調用所有的值到數組,並計算它,我該怎麼辦內查詢本身?哪一個實際上更快,最有效的網站?

+0

公式表明值以某種方式排列,或者你有標識,而─的一種方式是 - 這。 SQL表格代表*無序*集合,因此您的問題沒有足夠的信息來回答問題。 –

+0

@GordonLinoff所以不可能通過SQL來完成,因爲我無法識別* x常量? –

+0

將問題修改爲包含唯一標識後,顯然可以。 –

回答

2

您可以採用如下方案:

SELECT pid, 
    (((SUM(CASE WHEN rate = 5 THEN 5 ELSE 0 END) * 5) + 
    (SUM(CASE WHEN rate = 4 THEN 4 ELSE 0 END) * 4) + 
    (SUM(CASE WHEN rate = 3 THEN 3 ELSE 0 END) * 3) + 
    (SUM(CASE WHEN rate = 2 THEN 2 ELSE 0 END) * 2) + 
    (SUM(CASE WHEN rate = 1 THEN 1 ELSE 0 END) * 1))/SUM(rate)) AS c_rate 
FROM table_name 
WHERE pid = 1 
GROUP BY pid 

要格式化輸出,而不四捨五入您可以使用TRUNCATE結果。如果結果應舍入和截斷,也可以使用ROUND

使用TRUNCATE解決方案:

SELECT pid, 
    TRUNCATE((((SUM(CASE WHEN rate = 5 THEN 5 ELSE 0 END) * 5) + 
    (SUM(CASE WHEN rate = 4 THEN 4 ELSE 0 END) * 4) + 
    (SUM(CASE WHEN rate = 3 THEN 3 ELSE 0 END) * 3) + 
    (SUM(CASE WHEN rate = 2 THEN 2 ELSE 0 END) * 2) + 
    (SUM(CASE WHEN rate = 1 THEN 1 ELSE 0 END) * 1))/SUM(rate)), 1) AS c_rate 
FROM table_name 
WHERE pid = 1 
GROUP BY pid 

使用ROUND解決方案:

SELECT pid, 
    ROUND((((SUM(CASE WHEN rate = 5 THEN 5 ELSE 0 END) * 5) + 
    (SUM(CASE WHEN rate = 4 THEN 4 ELSE 0 END) * 4) + 
    (SUM(CASE WHEN rate = 3 THEN 3 ELSE 0 END) * 3) + 
    (SUM(CASE WHEN rate = 2 THEN 2 ELSE 0 END) * 2) + 
    (SUM(CASE WHEN rate = 1 THEN 1 ELSE 0 END) * 1))/SUM(rate)), 1) AS c_rate 
FROM table_name 
WHERE pid = 1 
GROUP BY pid 
+0

我已經用'(公式)AS速率'包裹了整個公式,但是對於我作爲示例顯示的表格,如果我做了'echo $ row ['rate'];'它顯示了'1.0000'而不是'4.25',我包裝錯了嗎? –

+0

看起來不錯(也請參閱我的更新)。嘗試另一個名字不存在於你的表... –

+0

仍然是同樣的問題,我實際上有一些我的'pid'命名使用字母和單詞而不是數字,會影響查詢?像'WHERE id = title-post' –