2012-05-30 26 views
0

我試圖獲取表中的行。在同一個表中獲取行

想象一下,我有兩個記錄(t1和t2)。我想獲取沒有t1.start_hour BETWEEN t2.start_hour和t2.finish_hour的行。我基本上只想得到與另一個小時沒有衝突的事件。

這是表:

create_table "occurrences", :force => true do |t| 
    t.string "start_hour" 
    t.string "finish_hour" 
    t.date  "start_date" 
    t.date  "finish_date" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.integer "activity_id" 
    end 

這是SQL查詢我想出迄今:

Occurrence.find_by_sql("SELECT * FROM occurrences t1 INNER JOIN occurrences t2 ON (t1.start_hour NOT BETWEEN t2.start_hour and t2.finish_hour)") 

它讓我重複的結果。我無法刪除它們並得到正確的答案。

感謝您的幫助提前。

INPUT

#<Occurrence id: 1, start_hour: "19:00", finish_hour: "20:20", start_date: "2012-05-30", finish_date: "2012-05-30", created_at: "2012-05-30 09:58:19", updated_at: "2012-05-30 09:58:19", activity_id: 1>, 

#<Occurrence id: 2, start_hour: "19:30", finish_hour: "20:10", start_date: "2012-05-30", finish_date: "2012-05-30", created_at: "2012-05-30 09:58:19", updated_at: "2012-05-30 09:58:19", activity_id: 2>, 

#<Occurrence id: 3, start_hour: "22:00", finish_hour: "23:20", start_date: "2012-05-30", finish_date: "2012-05-30", created_at: "2012-05-30 09:58:20", updated_at: "2012-05-30 09:58:20", activity_id: 3> 

OUTPUT

#<Occurrence id: 1, start_hour: "19:00", finish_hour: "20:20", start_date: "2012-05-30", finish_date: "2012-05-30", created_at: "2012-05-30 09:58:19", updated_at: "2012-05-30 09:58:19", activity_id: 1>, 

#<Occurrence id: 3, start_hour: "22:00", finish_hour: "23:20", start_date: "2012-05-30", finish_date: "2012-05-30", created_at: "2012-05-30 09:58:20", updated_at: "2012-05-30 09:58:20", activity_id: 3> 

與START_HOUR記錄= 19:30不輸出因爲是19:00和另一個的20:20之間。

編輯:

我得到了解決:

Occurrence.find_by_sql("SELECT start_hour FROM occurrences WHERE start_hour NOT IN (SELECT t2.start_hour FROM occurrences t1 INNER JOIN occurrences t2 ON ((t1.activity_id <> t2.activity_id AND t2.start_hour BETWEEN t1.start_hour and t1.finish_hour)))") 

感謝您的幫助

+0

請張貼一些示例數據和預期的輸出。 – Quassnoi

+0

我無法理解你在這裏實現的目標。如果你能提供更多關於你正在試圖解決的現實世界問題的細節,那會更好。 – rubish

回答

0

讓我們假設有3條記錄表。 (我正在整數代替DATATIME因爲這將是更容易)

id  start end 
    1  1  3 
    2  4  5 
    3  7  9 

當我將嘗試找到行的人開始不是起點和終點之間,比ID = 1兩第一行會真實並且會產生結果。類似地,對於id = 2(start = 4)的行,兩行都有資格(使第三行在結果中出現兩次)第三行也會發生同樣的情況,最後會出現六行。

它不是很清楚你想在這裏實現什麼,但把明顯將刪除重複。

編輯:你可能會考慮把內部連接放在開始和結束日期。

0

沒有(從內存中) 需要exlude記錄本身測試 - > t1.activity_id <> t2.activity_id 左加入,否則將無法獲得好的 那裏沒有右側

需要對此進行測試:對

SELECT * FROM occurrences t1 
left JOIN occurrences t2 
ON (t1.activity_id <> t2.activity_id and t1.start_hour BETWEEN t2.start_hour and t2.finish_hour) 
where t2.activity_id is null 
+0

結果是所有字段都爲零值的兩條記錄。 編輯:號碼記錄是正確的。 –