2013-02-11 72 views
0

我有一个MySQL数据库具有以下字段(简化,以显示问题):查询的选择基于多个日期列和排序

id | courseID | date1  | date2  | date 3  | date 4 
----------------------------------------------------------------- 
1 | 10  | 2013-01-01 | 2013-02-05 | 0000-00-00 | 0000-00-00 
2 | 23  | 2013-03-02 | 2013-05-04 | 2013-07-05 | 0000-00-00 
3 | 35  | 2013-02-01 | 0000-00-00 | 0000-00-00 | 0000-00-00 

我的问题是,我可以用什么查询查找所有课程在按日期降序排列的四个字段中的一个字段中具有小于或等于今天的日期。所以对于我的数据库上面的查询会给我:

id | courseID | date 
--------------------------- 
1 | 10  | 2013-02-05 
3 | 35  | 2013-02-01 
1 | 10  | 2013-01-01 

非常感谢您的帮助。

+1

你能够正常化这个表吗? – Kermit 2013-02-11 16:24:03

+0

@njk我继承了这一点,并同意规范化是明智的长期解决方案,但(像往常一样)我被要求尽快做出一些事情,所以想知道是否有人可以在此期间提供帮助。 – 2013-02-11 16:29:06

回答

1

如果无法规范化表,你可以使用UNION查询,例如:

SELECT id, courseID, date1 date 
FROM yourtable 
WHERE date1>'0000-00-00' and date1<=curdate() 
UNION 
SELECT id, courseID, date2 date 
FROM yourtable 
WHERE date2>'0000-00-00' and date2<=curdate() 
UNION 
SELECT id, courseID, date3 date 
FROM yourtable 
WHERE date3>'0000-00-00' and date3<=curdate() 
UNION 
SELECT id, courseID, date4 date 
FROM yourtable 
WHERE date4>'0000-00-00' and date4<=curdate() 
ORDER BY date 

见小提琴here

由于我使用UNION,所有重复项都将被删除。如果您不想删除重复项,则可以使用UNION ALL。

+1

你可能想要一个'UNION ALL',这样任何重复的东西都不会被删除。 – Taryn 2013-02-11 16:29:42

+0

@bluefeet是的我不确定在这种情况下最好使用UNION ALL还是只使用UNION ...我将编辑我的答案,谢谢 – fthiella 2013-02-11 16:31:53

+0

@fthiella感谢此 - 完美工作,我不知道SQL小提琴所以一个伟大的奖金! – 2013-02-11 23:14:14