2011-04-07 36 views
2

令我有两个表:MySQL的 - 由两列

事件:ID,姓名,date_from,DATE_TO

event_recurrences:ID,事项标识,date_from,DATE_TO

事件记录:

1, 'test 1', '2011-03-03 23:00:00', NULL 
2, 'test 2', '2011-03-05 23:00:00', NULL 
3, 'test 3', '2011-03-12 23:00:00', NULL 

活动重复记录:

1, 1, 2011-03-10 23:00:00, NULL 
2, 1, 2011-03-17 23:00:00, NULL 
3, 1, 2011-03-24 23:00:00, NULL 

现在我想获得的所有事件,并得到正确的排序是我的问题现在。

我的方法:

SELECT e.*, r.* 
FROM events AS e 
LEFT OUTER JOIN event_recurrences AS r ON (e.id = r.event_id) 
ORDER BY r.date_from, e.date_from 

的问题是现在的记录是不正确排序。 没有重复发生的记录总是在排序之前排序。

你能否帮助获得按照升序排列的日期,而无需优先处理没有重复发生的记录。

+4

你需要告诉我们什么是“正确”的意思(不,我们不能读懂你的想法,不,不明显 - 你是否试图按日期排序?)。到目前为止,我们只知道它应该是*别的东西*而不是你拥有的东西。 – Piskvor 2011-04-07 12:21:05

+0

'left inner join'不合法。真正的查询是“左外连接”吗? – 2011-04-07 12:25:25

+0

“正确”与以前的常识(常识)不同。但我会为你重述它! – n00b 2011-04-07 12:25:54

回答

2

你可以使用这个语法来把空值底部:

ORDER BY IF (ISNULL(my_field), 1, 0), my_field; 

其它数据库系统有类似NULLS LAST/NULLS FIRST

+0

非常感谢你!这样做的窍门:ORDER BY IF(ISNULL(r.date_from),e.date_from,r.date_from)ASC – n00b 2011-04-07 12:43:22

1

这样做

ORDER BY least(r.date_from, e.date_from) 

ORDER BY greatest(r.date_from, e.date_from) 

我不知道如果这是你需要的东西,但它会给你一个想法......

0

问题你加入了事件,然后再次发生它们,如果它们没有再次发生,那么不会再次发生的事件将不会被首先排序,这是因为事实上你已经说过要重新排序事件,如果它不会是NULL,NULL比任何事都少。

只有这样我能看到你得到你想要的答案会是:

select * from e union 
select (r.event_id as id, e.event, t.date_from from r 
    left join e on r.event_id=e.id) 
order by date_from 

应参加表到一个长长的清单和按日期排序

+0

有没有办法覆盖e.date_from的值的空字段? – n00b 2011-04-07 12:37:25