Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获取其他表列的平均值_Mysql - Fatal编程技术网

Mysql 如何获取其他表列的平均值

Mysql 如何获取其他表列的平均值,mysql,Mysql,我还有另一个名为“resource_ratings”的表,它将resource_id作为外键,并将用于注册评级的列称为“rating_level”。我需要得到评级水平列的平均值。但我觉得我做错了什么。因此,我复制了工作查询,但没有获得平均值,因此您可以从工作查询开始并获得额外的数据 SELECT a.company_id, a.company_code, a.company_name, a.company_name_s, b.resource_id,

我还有另一个名为“resource_ratings”的表,它将resource_id作为外键,并将用于注册评级的列称为“rating_level”。我需要得到评级水平列的平均值。但我觉得我做错了什么。因此,我复制了工作查询,但没有获得平均值,因此您可以从工作查询开始并获得额外的数据

SELECT 
    a.company_id,
    a.company_code,
    a.company_name,
    a.company_name_s,
    b.resource_id,
    b.resource_code,
    b.resource_name,
    b.resource_name_s,
    b.spec_id,
    b.resource_description,
    b.resource_description_s,
    d.slot_id,
    d.slot_period_minutes,
    d.slot_desc,
    e.res_slot,
    e.from_time,
    e.to_time,
    e.slot_date
FROM
    companies a,
    resources b,
    resource_periods c,
    period_slots d,
    resource_slots e
WHERE
    a.company_id = b.company_id
        AND a.is_active = 1
        AND b.is_active = 1
        AND b.company_id = c.company_id
        AND b.resource_id = c.resource_id
        AND c.allow_publish = 1
        AND c.company_id = d.company_id
        AND c.resource_id = d.resource_id
        AND c.period_id = d.period_id
        AND d.is_active = 1
        AND d.company_id = e.company_id
        AND d.resource_id = e.resource_id
        AND d.period_id = e.period_id
        AND d.slot_id = e.slot_id
        AND e.slot_status = 1
        AND a.company_id = IFNULL(@company_id, a.company_id)
        AND a.country_id = @country_id
        AND a.city_id = @city_id
        AND b.resource_id IN (SELECT 
            f.resource_id
        FROM
            resource_specialities f
        WHERE
            b.resource_id = f.resource_id
                AND f.spec_id = @speciality_id)
        AND e.slot_date = @slot_date

与获取平均值的子查询联接。您需要更改叉积语法以解释
JOIN
,因此可以在此处使用
左JOIN
(以防子查询中没有匹配的行)


“resource_id as foreign key”-它引用了什么?@PaulSpiegel resource_id in resources Table我认为这个查询最好的方法是在SELECT子句中使用一个相关子查询。@PaulSpiegel我相信MySQL在连接方面比相关子查询做得更好。@Barmar我见过很多不这样做的情况。“视情况而定”谢谢,但它返回的许多行的数据几乎相同,这是因为有多个行和其他表匹配。我认为我的更改不会导致重复的行。请注意,子查询(派生表)是未筛选的。然后,您正在使用(可能)一个未索引的临时表进行左联接。@Spiegel说得好。如果主查询执行广泛筛选,则RMathis答案中的相关子查询可能会更好。@DotFreeler但是子查询具有
按资源\u id分组
,因此它只为每个
资源\u id
返回一行。查看输出中的其他列,它们在每行上都不同,这意味着您在其他联接中有多个匹配项。请注意,您不能总是用联接替换in子查询。在这种情况下,您可能需要使用
选择DISTINCT
SELECT 
    a.company_id,
    a.company_code,
    a.company_name,
    a.company_name_s,
    b.resource_id,
    b.resource_code,
    b.resource_name,
    b.resource_name_s,
    b.spec_id,
    b.resource_description,
    b.resource_description_s,
    d.slot_id,
    d.slot_period_minutes,
    d.slot_desc,
    e.res_slot,
    e.from_time,
    e.to_time,
    e.slot_date,
    f.avg_rating
FROM companies a
JOIN resources b ON a.company_id = b.company_id
JOIN resource_periods c 
    ON b.company_id = c.company_id 
    AND b.resource_id = c.resource_id
JOIN period_slots d 
    ON c.company_id = d.company_id
    AND c.resource_id = d.resource_id
    AND c.period_id = d.period_id
JOIN resource_slots e
    ON d.company_id = e.company_id
    AND d.resource_id = e.resource_id
    AND d.period_id = e.period_id
    AND d.slot_id = e.slot_id
LEFT JOIN (
    SELECT resource_id, AVG(rating_level) AS avg_rating
    FROM resource_ratings
    GROUP BY resource_id) AS f
    ON f.resource_id = b.resource_id
WHERE
    a.is_active = 1
    AND b.is_active = 1
    AND c.allow_publish = 1
    AND d.is_active = 1
    AND e.slot_status = 1
    AND a.company_id = IFNULL(@company_id, a.company_id)
    AND a.country_id = @country_id
    AND a.city_id = @city_id
    AND b.resource_id IN (SELECT 
        f.resource_id
        FROM
            resource_specialities f
        WHERE
            b.resource_id = f.resource_id
                AND f.spec_id = @speciality_id)
    AND e.slot_date = @slot_date
SELECT 
    a.company_id,
    a.company_code,
    a.company_name,
    a.company_name_s,
    b.resource_id,
    b.resource_code,
    b.resource_name,
    b.resource_name_s,
    b.spec_id,
    b.resource_description,
    b.resource_description_s,
    (select avg(rating_level)
       from resource_ratings
      where resource_id = b.resource_id ) as avg_rating_level,
    d.slot_id,
    d.slot_period_minutes,
    d.slot_desc,
    e.res_slot,
    e.from_time,
    e.to_time,
    e.slot_date
FROM
    companies a,
    resources b,
    resource_periods c,
    period_slots d,
    resource_slots e,
    resource_specialities f
WHERE
    a.company_id = b.company_id
        AND a.is_active = 1
        AND b.is_active = 1
        AND b.company_id = c.company_id
        AND b.resource_id = c.resource_id
        AND c.allow_publish = 1
        AND c.company_id = d.company_id
        AND c.resource_id = d.resource_id
        AND c.period_id = d.period_id
        AND d.is_active = 1
        AND d.company_id = e.company_id
        AND d.resource_id = e.resource_id
        AND d.period_id = e.period_id
        AND d.slot_id = e.slot_id
        AND e.slot_status = 1
        AND a.company_id = IFNULL(@company_id, a.company_id)
        AND a.country_id = @country_id
        AND a.city_id = @city_id
        AND b.resource_id = f.resource_id
        AND f.spec_id = @speciality_id
        AND e.slot_date = @slot_date