【问题标题】:Join table and find there min/max(Collection) [duplicate]加入表并在那里找到 min/max(Collection) [重复]
【发布时间】:2017-09-14 11:40:37
【问题描述】:

我有一个结构:

public class ChosenCourseDate {

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name="chosencoursedate_id")
    List<ChosenCourseDatePeriod> chosenCourseDatePeriod;
}

public class ChosenCourseDatePeriod {

    Date startDateTime;
    Date endDateTime;

    @ManyToOne
    @JoinColumn(name="chosencoursedate_id")
    ChosenCourseDate chosenCourseDate;
}

我想在现有的 select 语句中添加一个新条件,以便在 ChosenCourseDatePeriod 中按最早 startDateTime 查找对象。

1)选择语句:

select registration from CourseRegistration registration
left join registration.chosenCourseDate as chosencoursedate
left join chosencoursedate.chosenCourseDatePeriod as period
where registration.candidate =:candidate
and registration.course =:course
and min(period.startDateTime) >=:now;

结果:

组函数的使用无效

2)选择语句:

select registration, min(period.startDateTime) as earliestDate from CourseRegistration registration
left join registration.chosenCourseDate as chosencoursedate
left join chosencoursedate.chosenCourseDatePeriod as period
where registration.candidate =:candidate
and registration.course =:course
and earliestDate >=:now;

结果:

“where 子句”中的未知列“earliestDate”,原因:null

3) 我决定使用 2 个SELECT 语句,这很有帮助。

select registration from CourseRegistration registration
    left join registration.chosenCourseDate as chosencoursedate
    where registration.candidate =:candidate
    and registration.course =:course
    and (SELECT min(period.startDateTime) FROM ChosenCourseDate inChosenCourseDate join inChosenCourseDate.chosenCourseDatePeriod period where inChosenCourseDate = chosenCourseDate) >=:now;

我的第一个和第二个解决方案有什么问题?可以只做一个SELECT吗?

【问题讨论】:

    标签: mysql select join hql


    【解决方案1】:

    您不能在 WHERE 子句上使用聚合函数,也不能在没有 GROUP BY 子句的情况下使用聚合函数。如果要检查最大日期,请添加 GROUP BY 子句并使用 HAVING 作为聚合函数的条件:

    SELECT registration
    FROM CourseRegistration registration
    LEFT JOIN registration.chosenCourseDate chosencoursedate
    LEFT JOIN chosencoursedate.chosenCourseDatePeriod period
    WHERE registration.candidate =:candidate
      AND registration.course =:course
    GROUP BY registration
    HAVING min(period.startDateTime) >=:now;
    

    您的第二个查询也无效,它应该只适用于旧版本的 MySQL ,因为您缺少 GROUP BY 子句。另一个原因是 - 您不能在创建它的同一层中使用派生列(您制作的列),因此解决方案是用另一个选择包装它:

    SELECT * FROM ( Your query... ) // It is not available inside the query
    WHERE earliestDate>=:now; // It is now available
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2019-11-11
      • 2022-11-25
      • 2022-07-26
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多