2009-11-19 65 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的行。