使用union和子查询引用一个值时,从更改表中获取新记录

时间:2012-04-03 21:12:25

标签: mysql union

我有2个表,用于存储课程和多年来课程名称的更改

表课程

year, record
2009, 'Basic English 101'
2009, 'Maths 100'
2010, 'Introduction to English 102'
2010, 'Maths 101'
2010, 'History 100'
2011, 'English 103'
2012, 'Maths 102'

表格更改

year, oldrecord', 'newrecord' 
2010, 'Basic English 101', 'Introduction to English 102'
2010, 'Maths 100', 'Maths 101'
2011, 'Introduction to English 102', 'English 103' 
2012, 'English 103', 'English 104'
2012, 'Maths 101' 'Maths 102'

我想要的是多年来展示coursename,

通过此查询,我设法获得2009年英语101的下一个记录& 2010

SELECT year, record AS coursename FROM courses 
WHERE record= 'Basic English 101'
UNION
SELECT Year, newrecord FROM changes 
WHERE newrecord = (SELECT newrecord FROM changes WHERE oldrecord='Basic English 101')

结果

year, coursename
2009, 'Basic English 101'
2010, 'Introduction to English 102'

我的问题是如何根据新记录的价值获得其他年份的其余记录?

我可以做另一个子查询,但如果将课程拆分为2,我将得到子查询返回多行错误。

感谢。

1 个答案:

答案 0 :(得分:0)

您需要为两个表添加唯一的id字段,这些表将链接课程而不依赖于名称。使用自动增量主键使其成为整数。

表课程应该只存储当前名称

year, record_id, record,
2010, 1, 'History 100'
2011, 2, 'English 103'
2012, 3, 'Maths 102'

表格更改应引用相关的record_id

year, record_id, oldrecord, newrecord 
2010, 2, 'Basic English 101', 'Introduction to English 102'
2010, 3, 'Maths 100', 'Maths 101'
2011, 2, 'Introduction to English 102', 'English 103' 
2012, 2, 'English 103', 'English 104'
2012, 3, 'Maths 101' 'Maths 102'

然后,您可以通过执行类似

的操作来获取英语记录的完整历史记录
SELECT oldrecord FROM changes WHERE record_id = 2
相关问题