簡體   English   中英

LEFT JOIN只是多對一的最新一行

[英]LEFT JOIN of only the latest row from a many-to-one

一直撞在牆上,無法解決這個問題:

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的答案,如果你正在尋找最新的日期時間我真的會改變MINMAX功能。

如果我假設你想要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

注意:這是一個可能的答案。 我將根據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`
    )

如果你想要min(或最早)datetime_created使用類似的東西

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM