【问题标题】:mysql get result from join tablemysql 从连接表中获取结果
【发布时间】:2020-09-30 23:00:12
【问题描述】:

我有一个表人和考试。

person

-------------
id  | name
-------------
1   | J.Doe
2   | Snow

exam
----------------------------------------------------
id | person_id | exam_no | exam_status | pass_date 
----------------------------------------------------
1  | 1         | 1       | PASS        | 2020-01-01
2  | 1         | 2       | PASS        | 2020-01-10
3  | 1         | 3       | PASS        | 2020-01-20
4  | 2         | 1       | PASS        | 2020-01-01
5  | 2         | 2       | NOT PASS    | NULL
6  | 2         | 3       | NOT PASS    | NULL

我想显示所有考试通过的数据,显示最新的考试 pass_date。如下表

----------------------
person_id | pass_date
----------------------
1         | 2020-01-20
2         | NULL

什么查询得到它? 请帮忙。谢谢!

【问题讨论】:

    标签: mysql sql date select group-by


    【解决方案1】:

    您可以使用聚合和条件表达式:

    select 
        person_id,
        case when max(exam_status = 'NOT PASS') = 0 then max(pass_date) end pass_date
    from exam
    group by person_id
    

    请注意,对于此示例数据,您无需引入person 表即可获得您想要的结果。

    【讨论】:

      【解决方案2】:

      你的问题模棱两可。如果您希望某个人的所有考试都通过,那么我建议:

      select p.*,
             (select max(e.pass_date)
              from exam e
              where e.person_id = p.id
              having sum(e.exam_status = 'PASS') = count(*)
             ) as pass_date
      from person p;
      

      但是,您也可能意味着您希望传递所有个可能的示例。如果是这样:

      select p.*,
             (select max(e.pass_date)
              from exam e
              where e.person_id = p.id
              having sum(e.exam_status = 'PASS') = ee.num_exams
             ) as pass_date     
      from person p cross join
           (select count(distinct exam_no) as num_exams from exam) ee;
      

      【讨论】:

      • 感谢您的回答,但以上数据只是一个示例。我还有一个与问题类似的案例。
      猜你喜欢
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多