Mysql 仅从多到一的最新行的左联接

Mysql 仅从多到一的最新行的左联接,mysql,Mysql,我的头撞在墙上,解决不了这个问题:\ SELECT `people`.*, `students`.*, `student_class_relationships`.*, `geo_checkin_on_campus`.`datetime_created` as checkin_time FROM `student_class_relationships` LEFT OUTER JOIN `students` ON `student_class_relationship

我的头撞在墙上,解决不了这个问题:\

SELECT
  `people`.*,
  `students`.*,
  `student_class_relationships`.*,
  `geo_checkin_on_campus`.`datetime_created` as checkin_time
FROM `student_class_relationships`
  LEFT OUTER JOIN `students`
    ON `student_class_relationships`.`student` = `students`.`id`
  LEFT OUTER JOIN `people`
    ON `students`.`student` = `people`.`id`
  LEFT OUTER JOIN `geo_checkin_on_campus`
    ON `students`.`id` = (
      SELECT MIN(`geo_checkin_on_campus`.`student`)
      FROM `geo_checkin_on_campus`
      WHERE `geo_checkin_on_campus`.`student` = `students`.`id`
    )
 WHERE `class` = 56
预期结果是许多行每个
students.id
只有一个条目


这是我的

从性能角度来看,这不是最好的查询

但为了解决您的问题,我尝试:

SELECT
  `people`.*,
  `students`.*,
  `student_class_relationships`.*,
  geoCheckinOnCampus.datetimeCreated as checkin_time
FROM `student_class_relationships`
  LEFT JOIN `students`
    ON `student_class_relationships`.`student` = `students`.`id`
  LEFT JOIN `people`
    ON `students`.`student` = `people`.`id`
  LEFT JOIN 
    (
      SELECT 
        student,
        MAX(datetime_created) datetimeCreated
      FROM `geo_checkin_on_campus`
      GROUP BY `student`
    ) geoCheckinOnCampus
  ON `students`.`id` = geoCheckinOnCampus.`student`
 WHERE `class` = 56

注意根据@xQbert答案,如果您要查找最新的日期时间,我真的会将
MIN
更改为
MAX
函数。

注意:这是一个可能的答案。我将根据OP的评论对其进行编辑/修改

这基本上没有任何作用。这就像加入学生id一样好

LEFT OUTER JOIN `geo_checkin_on_campus`
    ON `students`.`id` = (
      SELECT MIN(`geo_checkin_on_campus`.`student`)
      FROM `geo_checkin_on_campus`
      WHERE `geo_checkin_on_campus`.`student` = `students`.`id`
    )
如果要创建最小(或最早)日期时间,请使用

LEFT OUTER JOIN (
      SELECT `geo_checkin_on_campus`.`student` student,
              MIN(`geo_checkin_on_campus`.`datetime_created`) dt
      FROM   `geo_checkin_on_campus`
      WHERE  `geo_checkin_on_campus`.`student` = `students`.`id`
      GROUP BY `geo_checkin_on_campus`.`student`
    ) t
    ON `students`.`id` = t.student

如果我假设您希望每个学生在go_checkin_on_Campus中的最近签入(而不是最早创建的日期),那么

SELECT
  `people`.*,
  `students`.*,
  `student_class_relationships`.*,
  B.`datetime_Updated` as checkin_time
FROM `student_class_relationships`
  LEFT OUTER JOIN `students`
    ON `student_class_relationships`.`student` = `students`.`id`
  LEFT OUTER JOIN `people`
    ON `students`.`student` = `people`.`id`
  LEFT OUTER JOIN (
      SELECT max(datetime_updated), student
      FROM `geo_checkin_on_campus`
      group by student
) B
    ON `students`.`id` = B.Student
 WHERE `class` = 56

如果您在校园地理信息系统签入中有多行,则每个学生都会有多行。如果您只想要一个,那么需要指定您想要的(最早/最晚),然后我们可以相应地修改查询。另外,由于FKs,我相信一些左侧的外部联接可能是内部联接。请为SQLFIDLE提供一些数据和预期结果。很幸运,我得到了错误
error:ER\u BAD\u FIELD\u error:Unknown column“geo\u checkin\u on\u campus.datetime\u created”在“FIELD list”
中作为对其他人的说明,我使用了MAX,无法获取最新的日期时间