我有一些表格要尝试加入并获取列表结果
Interviews Table
+--------------+-----------+
| interview_id | Candidate |
+--------------+-----------+
| 1 | Ram |
| 2 | Rahim |
| 3 | Joseph |
+--------------+-----------+
Participant Ratings Table
+--------------+-----------+-------+
| interview_id | Rater Type|Rating |
+--------------+-----------+-------+
| 1 | Candidate | 4 |
| 2 | Candidate | 4 |
| 1 | Recruiter | 5 |
+--------------+-----------+-------+
System Ratings Table
+--------------+------------+-------+
| interview_id | Rating Type|Rating |
+--------------+------------+-------+
| 1 | Quality | 4 |
| 1 | Depth | 4 |
| 1 | Accuracy | 5 |
| 2 | Quality | 4 |
| 2 | Depth | 3 |
| 2 | Accuracy | 5 |
| 3 | Quality | 4 |
| 3 | Depth | 5 |
| 3 | Accuracy | 5 |
+--------------+------------+-------+
我需要以以下方式获取每次访问的平均评分结果。
+--------------+--------------+-----------------+-----------------+
| interview_id | System Rating|Recruiter Rating |Candidate Rating |
+--------------+--------------+-----------------+-----------------+
| 1 | 4.3 | 5 | 4 |
| 2 | 4.0 | 0 | 4 |
| 3 | 4.6 | 0 | 0 |
+--------------+--------------+-----------------+-----------------+
每个面试可以有一个1候选人评级和1招聘者评级,但这是可选的。如果给定记录,则会在参与者评分中创建带有评分和类型的记录。
需要获取所有类型的系统评级的平均值,并获得一个值作为系统评级,如果参与者提供的评级,那么如果参与者中的任何一个或两个参与者均未提供任何评级,则显示否则显示为0。
如果有错误,请忽略这些值。
我试图得到结果的SQL。
SELECT i.candidate, i.id AS interview_id,
AVG(sr.rating) AS system_rating,
AVG(CASE WHEN pr.rater_type = 'Candidate' THEN pr.rating END) AS candidate_rating,
AVG(CASE WHEN pr.rater_type = 'Recruiter' THEN pr.rating END) AS recruiter_rating
FROM system_ratings sr, participant_ratings pr, interviews i
WHERE sr.interview_id = i.id AND i.id = 2497 AND pr.interview_id = i.interview_id
问题是只要不存在参与者评分,就会因为加入而缺少结果。
最佳答案
使用LEFT JOIN
确保关系表中没有任何数据,但我们仍然可以从主表中获得记录。
参考:Understanding MySQL LEFT JOIN
问题:
字段名称错误:pr.interview_id = i.interview_id
,应为pr.interview_id = i.id
,因为我们在interviews
表中没有任何visit_id字段,因此应为id
字段-根据您的查询。pr.interview_id = i.id
子句中的where
:如果participant_rating
表没有给定采访的任何记录,这将导致从结果集中删除该采访。将LEFT JOIN
用于participant_rating
表。sr.interview_id = i.id
子句中的where
:如果system_rating
表没有给定采访的任何记录,这将导致从结果集中删除该采访。也将LEFT JOIN
用于system_rating
表。Usage of AVG
有效,但不适用于SUM, COUNT
..之类的其他聚合函数,因为如果我们具有一对多关系,那么join将使同一行有多个记录。
解:
SELECT
i.id AS interview_id,
i.candidate,
AVG(sr.rating) AS system_rating,
AVG(CASE WHEN pr.rater_type = 'Candidate' THEN pr.rating END) AS candidate_rating,
AVG(CASE WHEN pr.rater_type = 'Recruiter' THEN pr.rating END) AS recruiter_rating
FROM interviews i
LEFT JOIN system_rating sr ON sr.interview_id = i.id
LEFT JOIN participant_rating pr ON pr.interview_id = i.id
-- WHERE i.id IN (1, 2, 3) -- use whenever required
GROUP BY i.id
关于mysql - 如何联接有多个关系表并按类型获取结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57890951/