2015-05-02 105 views
1

我很努力地在rails中轉換sql查詢。在給定sql查詢的情況下轉換複雜查詢

背景

我有一個名爲總線3個表,停止和調度。總線表具有字段ID和名稱。停止表具有字段ID和名稱。計劃表包含字段標識,bus_id,stop_id,到達和bustag。

這是查詢我在SQL

select A.bus_id as busid, A.stop_id as source, A.arrival as atime, B.arrival as dtime from 
(SELECT * from schedules as S where S.stop_id = #{startStopId}) A 
inner join 
(SELECT * from schedules as S where S.stop_id = #{endStopId}) B 
on A.bustag = B.bustag 
where A.arrival < B.arrival 
and A.arrival > CURTIME(); 

在鐵軌我已經做到了這一點至今

@possible_buses = Schedule.where(stop_id: [startStopId,endStopId]) 

現在我想做的事情一樣MySQL查詢這是我想進一步處理這個可能的公共汽車列表獲得startStop中的公交車列表,其尾部標誌等於公共汽車的尾部標誌。停止處,起始處的到達時間少於終止處的到達時間。

如果有人能幫助我,我將非常感激。我在軌道查詢方面不太好,這對我有很大的幫助。

示例表

BusTable    StopTable  ScheduleTable 
id Name    id Name   id bus_id stop_id arrival bustag 
1 ttc(inbound)  1 mall   1 1  1  3:00  1 
2 ttc(outbound)  2 home   2 1  2  3:15  1 
         3 downtown  3 1  3  3:30  1 
         4 uptown  4 1  4  3:45  1 
             5 1  1  3:15  2 
             6 1  2  3:30  2 
             7 1  3  3:45  2 
             8 1  4  4:00  2 
             9 2  4  2:55  3 
             10 2  3  3:10  3 
             11 2  2  3:25  3 
             12 2  1  3:35  3 
             13 2  4  3:10  4 
             14 2  3  3:20  4 
             15 2  2  3:30  4 
             16 2  1  3:45  4 

示例查詢和預期產出

例如,如果用戶想從商場走在2:30到住宅區然後將下面的ID應該從返回時間表: - > 1,5。由於這兩個Ids都會爲您提供bus_id,可以讓您從商場到上城。

我希望這個更清楚。請隨時索取更多信息。謝謝。

+0

也許我們應該從簡化查詢 – Strawberry

+1

開始,如果你用表格數據樣本和展開結果和/或sqlfiddle來說明你的帖子,那麼這將非常有幫助 – Alex

+0

我可以這樣做,給我一分鐘。謝謝 – Unknowntiou

回答

0

其他awnsers提供了正確的SQL軌自定義查詢。所以我只展示如何在Rails中執行原始SQL。

Rails不僅支持活動記錄,還支持執行原始SQL。它返回一個數組,數組中的每個元素都是一個散列,其中所有選定的列作爲鍵和數據作爲值。返回的數組就像活動記錄方式返回的那樣。

這裏有一個例子:

# first establish connection, if not explicitly specify establish connection, it should use default configuration, which is config/database.yml 
ActiveRecord::Base.establish_connection(
    :adapter => "mysql2", 
    :host => "localhost", 
    :port => 3306, 
    :username => "myuser", 
    :password => "mypass", 
    :database => "somedatabase", 
    :pool => 1, 
    :timeout => 5000 
) 
sql = "select name, age from users where age < 30" 
raw = ActiveRecord::Base.connection.execute(sql) 
# raw is like [{"name" => "Tom", "age" => 28}, {"name" => "Bob", "age" => 26}] 
raw.each(:as => :hash) do |row| 
    puts row.inspect # row is hash, something like {"name" => "Tom", "age" => 28} 
end 

您可以運行rails runner 'puts ActiveRecord::Base.configurations.inspect'檢查您的默認數據庫連接信息。

+0

您是否需要指定連接名稱主機名和用戶名? – Unknowntiou

+0

@Unknowntiou答案已更新。 – coderz

0

這是一個更好的查詢,理論上應該做同樣的事情。

我會在更多細節提供後更新我的回覆。

SELECT 
    start.bus_id busid, 
    start.stop_id source, 
    start.arrival atime, 
    stop.arrival dtime 
FROM 
    schedules start 
INNER JOIN 
    schedules stop ON 
     stop.bustag = start.bustag 
     AND stop.arrival > start.arrival 
WHERE 
    start.stop_id = #{startStopId} 
    AND stop.stop_id = #{endStopId}) 
    AND start.arrival > now(); 
+0

嗨Augwa我剛剛添加更多的信息,我想知道如果你查詢是可以做在Rails使用活動記錄查詢方法 – Unknowntiou

+0

它應該是可能的,因爲這個查詢沒有什麼瘋狂的事情發生。我不熟練使用活動記錄或軌道,所以我不能給你一個超越sql查詢方面的適當響應。 – Augwa

0

對不起,應該是一個評論,但只要我做的工作對你

http://sqlfiddle.com/#!9/45f47/9

而且我希望你能解釋什麼是錯的查詢或結果我張貼此回答未來的真實迴應。

因此,您可以在我的小提琴中看到您的查詢(選擇A.id字段進行小的更改)已經返回您預期的1,5值。那麼,什麼是錯的?你在找什麼其他結果?

select A.id, A.bus_id as busid, A.stop_id as source, A.arrival as atime, B.arrival as dtime from 
(SELECT * from ScheduleTable as S where S.stop_id = 1) A 
inner join 
(SELECT * from ScheduleTable as S where S.stop_id = 4) B 
on A.bustag = B.bustag 
where A.arrival < B.arrival 
and A.arrival > '2:30'; 

編輯https://stackoverflow.com/a/15408419/4421474這裏是解決如何運行與

+0

我想在Rails中做到這一點,而不使用sql – Unknowntiou