2011-04-07 34 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