如何加入有许多关系表,并获取按类型导致(How to join has many relation

2019-10-30 13:40发布

我有我想要的清单加入并获取结果了几桌

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

问题是,每当参与者评级不存在,那么结果失踪有加盟。

Answer 1:

使用LEFT JOIN以确保如果关系表没有任何数据,还是我们可以从主表中的记录。

参考: 了解MySQL的左连接

发行人:

  • 错误的字段名pr.interview_id = i.interview_id ,它应该是pr.interview_id = i.id ,因为我们没有任何interview_id场interviews表,这将是id -根据您的查询字段。
  • pr.interview_id = i.idwhere子句 :如果participant_rating表中没有为给定的采访任何记录,这将导致去除结果集中采访。 使用LEFT JOINparticipant_rating表。
  • sr.interview_id = i.idwhere子句 :如果system_rating表中没有为给定的采访任何记录,这将导致去除结果集中采访。 使用LEFT JOINsystem_rating表了。
  • Usage of AVG的作品,但不会像其他的聚集功能工作SUM, COUNT ..因为如果我们有一对多的关系,然后加入将使会有同一行的多个记录。

解决方案

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


文章来源: How to join has many relation table and fetch result by type