【问题标题】:Join two queries together将两个查询连接在一起
【发布时间】:2011-04-25 14:05:38
【问题描述】:

我有一个数据库,其中包含以下表格中的大量学生信息

Student:
    id
    created_on
    updated_on

StudentHistory
    id
    studentid
    schoolid
    gradeid
    datestamp
    active

学生历史管理着学生多年来的变化,并允许我报告学生的成长情况。

我现在需要执行以下查询:

SELECT * FROM students
INNER JOIN studenthistory
    ON student.id = studenthistory.studentid
WHERE studenthistory.active = 1

问题是查询不一定会像我需要的那样提取最新的历史记录。有没有一种方法可以保证只有最新的历史记录才会被加入?

【问题讨论】:

  • 如何添加“order by datestamp desc”并获取第一行
  • 这还不够,他可能想要每个学生的最新历史记录
  • 我确实想要每个学生的最新历史记录。

标签: mysql sql inner-join


【解决方案1】:
SELECT  *
FROM    students s
JOIN    studentshistory sh
ON      sh.id =
        (
        SELECT  shi.id
        FROM    studentshistory shi
        WHERE   shi.studentid = s.id
                AND shi.active = 1
        ORDER BY
                studentid DESC, active DESC, datestamp DESC, id DESC
        LIMIT 1
        )

studentshistory (studentid, active, datestamp, id) 上创建一个索引以使其快速工作。

【讨论】:

  • 您不需要按 studentid、active 或 id 排序。
  • @Frits:对studentid, active 进行排序将使MySQL 正确使用索引。在id 上排序将消除重复项。这是你投反对票的原因吗?
  • 什么索引?你不需要索引。不要使事情过于复杂。
  • @Frits:澄清一下:这不是一个论坛,这是一个问答网站。通常,说服的最好方法是写下你自己的答案。
  • @Conrad: 啊,那么请随意看看:) 使用LEFT JOIN,它也会返回没有活动历史记录的学生。
【解决方案2】:

我认为这应该可行:

SELECT * FROM Students
INNER JOIN StudentHistory sh1 
  ON Student.studentid = sh1.studentid 
  AND StudentHistory.datestamp = 
    (SELECT MAX(datestamp) 
     FROM StudentHistory sh2 
     WHERE sh2.studentid = sh1.studentid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多