我有一些表格要尝试加入并获取列表结果

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/

10-14 15:13
查看更多