如何使用LEFT JOIN优化此SQL查询?

时间:2013-04-03 14:51:49

标签: mysql join left-join

我遇到以下SQL查询的问题。正如你所看到的,我加入了一些表(candidate_basic,candidate_lang,province_of_candidate,province,degree_of_candidate),然后我将结果与另一个表“professional_experience_basic”结合,但是,查询返回了几个实例(例如:它返回id_candidate_basic =的两个实例= 55,或者它返回三个id_candidate_basic = 59的实例。

我的问题是我只希望查询每个id_candidate_basic返回1个实例。也就是说,属性为“main_job”且值为1的实例,如果不可能,则只为null。

我尝试将 AND professional_experience_basic.main_job = 1 放在WHERE子句中,但是,它会删除 main_job = null 的实例。

我觉得我接近最后的结果但是我在最后的努力中花了很多时间。有谁知道解决方案? 提前谢谢。

查询:

SELECT DISTINCT
    candidate_basic.id_candidate_basic,
    candidate_lang.town,
    province.name,
    degree_of_candidate.id_degree_of_candidate,professional_experience_basic.main_job

FROM (((((candidate_basic
    INNER JOIN candidate_lang 
    ON candidate_lang.id_candidate_basic=candidate_basic.id_candidate_basic)
    INNER JOIN province_of_candidate
    ON province_of_candidate.id_candidate_basic=candidate_basic.id_candidate_basic)
    INNER JOIN province
    ON province.id_province=province_of_candidate.id_province)
    INNER JOIN degree_of_candidate
    ON degree_of_candidate.id_candidate_basic=candidate_basic.id_candidate_basic)
    LEFT JOIN professional_experience_basic
    ON professional_experience_basic.candidate_id=candidate_basic.id_candidate_basic)

WHERE candidate_basic.candidate_state=2
  AND degree_of_candidate.is_main_degree
  AND candidate_lang.id_website_lang=1

目前的结果:

enter image description here

我想要的结果:

enter image description here

2 个答案:

答案 0 :(得分:1)

在列列表中将professional_experience_basic.main_job更改为max(professional_experience_basic.main_job),然后:

GROUP BY candidate_basic.id_candidate_basic, candidate_lang.town,
          province.name, degree_of_candidate.id_degree_of_candidate

答案 1 :(得分:-1)

首先对结果进行分组

... AND candidate_lang.id_website_lang=1
GROUP BY 
    candidate_basic.id_candidate_basic,
    candidate_lang.town,
    province.name,
    degree_of_candidate.id_degree_of_candidate

而且我认为你想要main_job的最大值,但我不知道。 将选择更改为:

SELECT DISTINCT
    candidate_basic.id_candidate_basic,
    candidate_lang.town,
    province.name,
    degree_of_candidate.id_degree_of_candidate,MAX(professional_experience_basic.main_job)

好像你想要最大值,但我不知道