2009-11-19 40 views
3

我有兩個表,一個是供應商,一個是supplier_feedback - 我如何計算每個供應商的平均評分?我目前有這樣的:從另一個MySQL表中計算平均數

SELECT s.premium, s.supplier_id, s.name, s.phone, s.website, 
    s.price_low, s.price_high, s.address1, s.address2, s.town, 
    s.county, s.postcode, 
    (SUM(f.rating)/(COUNT(f.rating) -1)) AS rate, 
    GROUP_CONCAT(REPLACE(t.name, ' ', ',') SEPARATOR ',') AS tags 
FROM suppliers AS s 
JOIN suppliers_to_tags AS st ON st.supplier_id = s.supplier_id 
JOIN supplier_tags AS t ON t.tag_id = st.tag_id 
JOIN supplier_feedback AS f ON s.supplier_id = f.supplier_id 
GROUP BY s.supplier_id 
HAVING tags LIKE '%HI%' 
ORDER BY s.premium DESC 
LIMIT 0 , 30 

但是我得到很奇怪的結果,這肯定是不正確的。

supplier_feedback表將包含許多記錄,但第一條記錄必須因各種原因打折。

+0

您是否在使用AVG功能? http://www.w3schools.com/SQL/sql_func_avg.asp – Adrian 2009-11-19 11:05:05

+0

您是否想要忽略每個供應商的supplier_feedback表的第一條記錄,或只是表中的第一條記錄? – Chris 2009-11-19 11:11:24

回答

0

使用子查詢使事情變得更簡單,通過這種方式,您可以單獨測試子查詢的所有連接到其他表的正確性。

(SELECT supplier_id, AVG(rating) AS avg_rating 
FROM supplier_feedback WHERE feedback_id != x GROUP BY supplier_id) 

假設feedback_id(無論對於反饋表的主鍵)立住您可以排除你想從子查詢中忽略的記錄,其餘的將被平均。

然後,您可以使用此連接:

SELECT s.*, r.avg_rating 
    FROM suppliers s 
    JOIN 
    (SELECT supplier_id, AVG(rating) AS avg_rating 
    FROM supplier_feedback WHERE feedback_id != x GROUP BY supplier_id) r 
    ON s.supplier_id = r.supplier_id 
1

上標籤的加入是從反饋造成行出現多次。這會導致平均值下降。您可以用標記和平均值的子查詢來重寫FROM部分。這可以確保他們的計算不干擾:

SELECT 
    <other columns> 
, feedback.rating 
, suptags.tags 
FROM suppliers AS s 
JOIN (
    SELECT 
     st.supplier_id 
    , GROUP_CONCAT(REPLACE(t.name, ' ', ',') SEPARATOR ',') AS tags 
    FROM suppliers_to_tags AS st 
    JOIN supplier_tags AS t ON t.tag_id = st.tag_id 
    GROUP BY st.supplier_id 
) as suptags ON suptags.supplier_id = s.supplier_id 
JOIN (
    SELECT 
     fb1.supplier_id 
    , AVG(fb1.rating) as rating 
    FROM supplier_feedback fb1 
    WHERE fb1.feedback_id NOT IN (
     SELECT min(fb2.feedback_id) 
     FROM supplier_feedback fb2 
     WHERE fb2.supplier_id = fb1.supplier_id 
    ) 
    GROUP BY fb1.supplier_id 
) feedback ON s.supplier_id = feedback.supplier_id 

suptags子查詢每增加了供應商的所有標籤爲一個字符串。子查詢feedback計算平均評分,排除具有最低的feedback_id的行。