Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将两个查询合并为一个查询,作为子查询_Mysql_Sql_Sql Server 2008 R2 - Fatal编程技术网

Mysql 将两个查询合并为一个查询,作为子查询

Mysql 将两个查询合并为一个查询,作为子查询,mysql,sql,sql-server-2008-r2,Mysql,Sql,Sql Server 2008 R2,我的第一个查询从3个表中提取学生详细信息。学生、学生地址和学生笔记 我的查询必须列出学生的详细信息,包括id、姓名、地址、备注,并找到他们最早报名参加课程的日期 为此,我创建了一个聚合查询 SELECT STU_Name, MIN(ENR_StartDate) FROM Student INNER JOIN Enrolment ON Student.STU_Student_ID = Enrolment.ENR_Student_ID GROUP BY STU_Name 这是我的主要查询,其中拉学

我的第一个查询从3个表中提取学生详细信息。学生、学生地址和学生笔记

我的查询必须列出学生的详细信息,包括id、姓名、地址、备注,并找到他们最早报名参加课程的日期

为此,我创建了一个聚合查询

SELECT STU_Name, MIN(ENR_StartDate)
FROM Student
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
GROUP BY STU_Name
这是我的主要查询,其中拉学生的细节

SELECT STU_Name, ADD_Addr_Line_1, ADD_Addr_Line_2, ADD_Addr_Line_3, ADD_Postcode, NTE_Note, ENR_StartDate
FROM Student
INNER JOIN StudentAddress
ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
INNER JOIN StudentNote
ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
我想链接这些查询,以便结果集告诉我行中每个学生的最早开始日期

学生期望的输出

row0: student1id, student1name, student1address, student1note1, student1startdate

row1: student1id, student1name, student1address, student1note2, student1startdate
这将允许一个学生有多个笔记,但开始的计算始终与学生相同

我已经在SQLFIDLE中构建了一个测试模式


感谢您的帮助。

您应该为所有列添加一个表别名,以指定它们的来源

SELECT STU_Name, ADD_Addr_Line_1, ADD_Addr_Line_2, ADD_Addr_Line_3, ADD_Postcode, NTE_Note, ENR_StartDate,
    G.EarliestStartDate
FROM Student
JOIN StudentAddress
        ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
JOIN StudentNote
        ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
JOIN Enrolment
        ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
JOIN (
  SELECT Student.STU_Student_ID, MIN(ENR_StartDate) EarliestStartDate
  FROM Student
  INNER JOIN Enrolment
  ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
  GROUP BY STU_Name
) G on G.STU_Student_ID = Student.STU_Student_ID

请注意,您没有为其中一个学生记录。这已通过外部连接更正

在另一种情况下,一个学生有两张笔记。因此,学生在结果中有两行

要解决这个问题,您需要选择一个特定的注释(第一个、最后一个等)。您可以使用与查找每个学生的第一个注册记录相同的逻辑来完成此操作

调整以处理学生在同一注册日期可能有多行的情况。这种方法可以用来打破大多数这类关系。请注意,窗口函数通常是更好的方法,但MySQL不支持它们

SELECT STU_Name
     , ADD_Addr_Line_1
     , ADD_Addr_Line_2
     , ADD_Addr_Line_3
     , ADD_Postcode
     , NTE_Note
     , Enrolment.ENR_StartDate
     , Enrolment.ENR_ID
     , Student.STU_Student_ID
     , StudentAddress.ADD_ID
     , StudentNote.NTE_ID
  FROM Student
  JOIN StudentAddress
    ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
  LEFT JOIN StudentNote
    ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
  JOIN Enrolment
    ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
  LEFT JOIN Enrolment AS e2
    ON Enrolment.ENR_Student_ID = e2.ENR_Student_ID
   AND (Enrolment.ENR_StartDate, Enrolment.ENR_ID) > (e2.ENR_StartDate, e2.ENR_ID)
 WHERE e2.ENR_StartDate IS NULL
;

谢谢,这正是我想做的。我的分数应该是+1?哈哈,我会分类的。非常感谢您的快速响应。您将得到一个笛卡尔产品,学生在同一日期开始注册4门课程(非常常见!),这始终是您需要记住的问题。这个解决方案只是为了展示这个概念。如果你不小心,这些表格中的任何一个都会产生奇怪的结果。有一种简单的方法可以打破注册表中的关系,只需对ON子句进行一个简单的更改。