2012-03-16 64 views
1

我正在嘗試爲我的數據庫編寫查詢。帶有數組的SQL查詢

基本上,我有一個包含房間號的字符串數組,我需要與另一個包含房間中事件的數據庫進行匹配。我想找到在那個房間裏發生的下一個事件。 例如: 我有一個包含[ZACH102,ZACH103]的陣列房間。我想找到數據庫來返回ZACH102和ZACH103中發生的下一個事件。我知道如何使用下面的查詢查找1個房間的事件。但是,我如何使用數組來做到這一點?

select name, 
     eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
from  the_table 
where the_table.room = ZACH102 
order by time_from_test 
limit 1 

在此先感謝!

編輯:對不起,如果我的解釋不夠清楚,但我只想在數組中的每個房間的最早事件。結束時請注意limit 1

編輯:是的,我把限1那裏意味着我只希望扎克102 1個事件,然後我想1個事件扎克103.我解釋說,上面的代碼只發現事件1間。

+0

你是如何傳遞數組?它是一個SQL數組還是使用不同的語言,然後調用該函數? – Gage 2012-03-16 18:21:32

+0

我有一個來自數據庫查詢的結果,我在這裏解析php中的信息,並將房間的名稱放入數組中。然後,我想要使用該數組進行上面的查詢 – maknelly 2012-03-16 18:24:10

+0

另外它time_from_test是必要的,還是您只需要從當前系統時間查找下一個事件? – Gage 2012-03-16 19:54:44

回答

3

在SQL Server中我會使用一個公用表表達式。但是,因爲它看起來像你使用MySQL,我會做這樣的事情:

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    where the_table.room in ('ZACH102', 'ZACH103') 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 

最終你會需要動態設置此,你不知道你的IN (...)條款的內容提前。到了這個時候,最好的辦法是提前計劃,以便數組已經存儲在某個表中。這會給你兩個選擇。首先是窩在你的IN (...)條件的子查詢:

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    where the_table.room in (select room from shopping_cart where session_key='MySessionKey') 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 

另一種是使用連接:

select t2.name, t2.room, t2.eventtime, t2.time_from_test 
from the_table t1 
inner join 
(
    select name, room, 
     min(eventtime) as eventtime, 
     (eventtime - currenttime) > 0 as time_from_test 
    from  the_table 
    inner join shopping_cart on shopping_cart.room = the_table.room 
    where shopping_cart.session_key = 'MySessionKey' 
    group by name, room 
    order by time_from_test 
) t2 on t2.room = t1.room and t2.name = t1.name 
1
where the_table.room in ('ZACH102', 'ZACH103') 
+0

所以這會返回2個事件,其中1個是zach102中最早的事件,zach 103中最早的事件? 也如果我的陣列的名稱是$房間我只是做 其中the_table.room在$房間? – maknelly 2012-03-16 18:16:03

+0

使用where子句基本上意味着查詢將返回帶有ZACH102和ZACH103房間的所有記錄。然後,您的訂單將按時間排列所有記錄。所以它只會選擇其中一個房間的最佳時間。你正在尋找每個房間的最佳時間? – Gage 2012-03-16 18:24:10

+0

是的,先生,即時尋找在每個房間的最佳時間。 – maknelly 2012-03-16 18:25:07