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