2012-03-16 63 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